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条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
    • ¥30 求一段fortran代码用IVF编译运行的结果
    • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
    • ¥15 lammps拉伸应力应变曲线分析
    • ¥15 C++ 头文件/宏冲突问题解决
    • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
    • ¥50 安卓adb backup备份子用户应用数据失败
    • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
    • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
    • ¥30 python代码,帮调试,帮帮忙吧