You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:57:27