zoeyzj 2019-01-11 14:58
浏览 738

QT 在使用了QWebEngineView后QPrinter功能为何阻塞在StartDoc(d->hdc, &di)?

代码中使用了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;

}

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
    • ¥15 名为“Product”的列已属于此 DataTable
    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)