如何获取QPrinter打印(含多页)结果,根据成败弹窗提示?
获取QPrinter多页打印的执行结果
核心判断逻辑
QPrinter没有直接的打印成功回调,但可以通过几个关键节点的状态检查来判断打印是否正常完成:
- 校验
QPainter的初始化结果 - 检查
printer.newPage()的返回值 - 打印完成后结合
QPrinter::printStatus()确认状态 - 若使用打印对话框,先判断用户是否确认打印操作
改进后的完整代码
QPrinter printer(QPrinter::HighResolution); // 若需要用户确认打印,先弹出对话框判断 QPrintDialog dialog(&printer); if (dialog.exec() != QDialog::Accepted) { QMessageBox::information(nullptr, "提示", "打印已取消"); return; } QPainter painter; // 初始化打印画家,失败则直接提示 if (!painter.begin(&printer)) { QMessageBox::critical(nullptr, "错误", "打印初始化失败,请检查打印机状态"); return; } bool printSuccess = true; for (int i = 0; i < pathList.size(); i++) { QString path = pathList[i]; QImage image(path); // 检查图片是否加载成功 if (image.isNull()) { QMessageBox::warning(nullptr, "警告", QString("第%1页图片加载失败,已跳过").arg(i+1)); printSuccess = false; // 尝试跳转下一页,失败则终止打印 if (i < pathList.size() - 1 && !printer.newPage()) { printSuccess = false; break; } continue; } QRect rect = painter.viewport(); QSize size = image.size(); size.scale(rect.size(), Qt::KeepAspectRatio); painter.setViewport(rect.x() + (rect.width() - size.width()) / 2, rect.y() + (rect.height() - size.height()) / 2, size.width(), size.height()); painter.setWindow(image.rect()); painter.drawImage(0, 0, image); // 跳转新页时检查是否成功 if (i < pathList.size() - 1) { if (!printer.newPage()) { QMessageBox::critical(nullptr, "错误", "创建新打印页失败"); printSuccess = false; break; } } } painter.end(); // 根据最终状态弹出对应提示 if (printSuccess) { // 结合打印机状态做进一步确认,不同平台表现可能有差异 if (printer.printStatus() == QPrinter::Idle) { QMessageBox::information(nullptr, "提示", "打印任务已提交成功"); } else { QMessageBox::information(nullptr, "提示", "打印任务正在处理中"); } } else { QMessageBox::critical(nullptr, "错误", "打印过程中出现异常"); }
关键检查点说明
- 画家初始化:
painter.begin(&printer)返回false,说明打印机未就绪、无权限或设备异常 - 新页创建:
printer.newPage()返回false,代表无法继续创建新打印页,大概率是打印机故障 - 资源有效性:提前检查图片是否加载成功,避免无效内容导致打印中断
- 打印后状态:
QPrinter::printStatus()可以获取打印机当前状态,Idle表示任务已提交完成,部分平台可能无法实时返回精确状态
平台补充说明
Windows平台若需要更底层的任务状态监控,可以通过QPrinter::winPrinterId()获取打印机句柄,调用Windows原生API(如GetJob)查询任务详情,但这种方式需要编写平台相关代码,跨平台场景优先使用Qt自身的状态判断逻辑。
内容的提问来源于stack exchange,提问作者douxiaobao
相关产品推荐
相关产品推荐

