代码中使用了QWebEngineView类的load方法(page()方法也是一样)后,再调用QPringter类实现打印功能的时候,打印功能一直阻塞在了if(m_painter.begin(m_printer))这句,跟踪源码,发现实际是win32函数StartDoc阻塞。程序无响应。
即使将QWebEngineView disconnet,并且delete,打印仍然阻塞。
即使将打印部分放在另一个线程中,也仍然阻塞。
将QWebEngineView的所有调用都注释掉后,就可以顺利打印了。
这是为何?可有建议或相关调试经历?
代码如下:
MainWindow::MainWindow(QWidget parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
/
QWebEngineView m_webEngineView;
QPrinter m_printer;
QPainter m_painter;
HANDLE m_hPrintHandle = 0;
*/
//QWebEngineView 创建
m_webEngineView = NULL;
m_webEngineView = new QWebEngineView(this);
m_webEngineView->load(QUrl("http://www.baidu.com"));
m_webEngineView->setGeometry(QRect(10,10,300,300));
m_webEngineView->show();
m_webEngineView->disconnect(this);
m_webEngineView->deleteLater();
delete m_webEngineView;
//打印功能
GetMyPrinter();
}
void MainWindow::GetMyPrinter()
{
m_printer = NULL;
QList<QPrinterInfo> list = QPrinterInfo::availablePrinters();
qDebug()<<"QPrinterInfo list ="<<list.size();
for(int i=0; i<list.size(); i++)
{
QString szPrintDesc="M129-M134";
QPrinterInfo eachInfo = list.at(i);
QString strPrinterName = eachInfo.printerName();
qDebug() << u8"print 打印机列表:" << i << strPrinterName.toUtf8().data();
if(strPrinterName.contains(szPrintDesc)) //HP //可以根据实际可以的打印机灵活修改
{
qDebug() << u8"print 找到打印机驱动=" << strPrinterName;
m_printer = new QPrinter(eachInfo);
m_printer->setPageSizeMM(QSize(55,120));
m_printer->setFullPage(true);
}
}
//打开打印设备 OpenPrinter调用
getAllPrinterName();
//调用至此(m_painter.begin)一直阻塞,单步调试发现阻塞在了QT源码QWin32PrintEngine::begin中的StartDoc(d->hdc, &di),此函数一直阻塞,等不到返回。
if(m_painter.begin(m_printer)) //阻塞部分
{
qDebug()<<"can print";
}
}
void MainWindow::getAllPrinterName()
{
DWORD dwSize = 0;
DWORD dwPrinters = 0;
//QString strPrintersName = "";
PRINTER_DEFAULTS pd;
ZeroMemory(&pd, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;
//第一次调用得到结构体的大小
::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL,
NULL, 5, NULL, 0, &dwSize, &dwPrinters);
//第二次调用得到打印机列表
BYTE *pBuffer = new BYTE[dwSize];
::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL,
NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters);
//得到所有的打印机名称
qDebug()<<"VC++ dwPrinters ="<<dwPrinters;
if(dwPrinters != 0)
{
PRINTER_INFO_5 *pPrinterInfo = (PRINTER_INFO_5 *)pBuffer;
for(int i=0; i<dwPrinters; i++)
{
QString printerName = QString::fromStdWString(pPrinterInfo->pPrinterName);
if(printerName.contains("M129-M134"))
{
//检测打开打印机设备是否成功
if(!OpenPrinter(pPrinterInfo->pPrinterName, &m_hPrintHandle, &pd))
{
qDebug()<<"zj open printer wrong!";
return;
}
}
pPrinterInfo++;
}
}
delete []pBuffer;
}