QT QPrintPreviewDialog 当打印VS调试崩

QT打印时,以VS调试启用,调用到打印时会崩溃,直接运行就不崩了,QT-5.15.2 VS2019
打印预览不崩,当点击右上角打印时,运行到slotPintPreview的histPainter.begin(printer)这一行就崩了。

QPrinter printer;
    printer.setOutputFormat(QPrinter::NativeFormat);
    printer.setPageSize(QPagedPaintDevice::A4);
    printer.setOrientation(QPrinter::Portrait);
    printer.printerName();//获取默认打印机
    printer.setNumCopies(1);
    printer.setPageOrder(QPrinter::FirstPageFirst);//设置打印顺序

    printer.setPageMargins(6, 6, 6, 6, QPrinter::Millimeter);
    printer.setPageSize(QPrinter::A4);
QPrintPreviewDialog* pPreviewDialog = new QPrintPreviewDialog(&printer);
        connect(pPreviewDialog, &QPrintPreviewDialog::paintRequested, this, &HistoryDataWin::slotPintPreview);//关联打印预览的内容
        pPreviewDialog->resize(1000, 900);
        pPreviewDialog->exec();
        delete pPreviewDialog;
        pPreviewDialog = nullptr;
  void HistoryDataWin::slotPintPreview(QPrinter* printer)
{
    QPainter histPainter;
    //printer->setPageSize(QPrinter::A4);
    int posPos = 0;
    int monitorPos = 0;
    histPainter.begin(printer);
    paintHist(&histPainter, posPos, monitorPos);
    histPainter.end();
}

img

img

我也遇到过同样的问题,是因为打印机的库没安装好。楼主可以从这个角度尝试下看能否解决。

你的这些代码前后不完整看不出具体哪里的错误,我怀疑paintHist函数可能有问题,把paintHist代码粘出来看看。

试一下:
直接
1、QPainter histPainter(printer);
注释掉 begin() 和 end();
2、把histPainter 改成 堆变量
QPainter* histPainter=new QPainter;
histPainter->begin(....)

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
从您的描述来看,问题可能出在 histPainter.begin(printer) 这一行。这是因为在调试模式下,应用程序有时会使用不同的内存布局,这可能会导致访问非法内存的错误。这种情况下,可能需要在代码中进行一些调整,以确保在不同的运行模式下都能够正确运行。

下面是一些可能有用的调试技巧:

  1. 使用 QPrintDialog 而不是 QPrintPreviewDialog 进行打印。这可以帮助您确定是打印预览对问题的影响,还是与打印机、打印驱动程序等相关的其他问题。

  2. 检查 printer 变量是否被正确初始化并包含预期值。例如,对于 printerName(),可能需要检查默认打印机名称是否正确,可以添加一些输出语句来确认这些值。避免直接调用 printer.setOutputFileName()printer.setOutputFormat(),因为这会覆盖打印机驱动程序的配置,最好使用默认值。

  3. 确保 paintHist 函数正确处理了所有参数值,例如 posPosmonitorPos,并正确地绘制了 histPainter

建议将代码中的 printer.printerName(); 变为 qDebug() << printer.printerName();,此时运行程序时将在终端输出默认打印机名称,看看输出的名称是否符合预期。

如果您尝试了这些步骤后仍然遇到问题,请确保您的代码是完整和可重现的,并尽可能提供更多细节和错误消息。
如果我的回答解决了您的问题,请采纳!

题主你可以把printer的那些set函数一个个注释试一下,有些设置了反而有问题

引用chatGPT作答,从您提供的代码中可以看出,在打印预览对话框中打印工作正常。但是,当您单击对话框的“打印”按钮时,调用slotPintPreview函数时会导致崩溃。

有几个可能的原因:

1.内存泄漏:如果在paintHist函数中有内存泄漏或其他错误,那么当您单击“打印”按钮时,这些问题可能会导致程序崩溃。

2.指针问题:如果在paintHist函数中使用了指向已删除对象的指针,那么当您单击“打印”按钮时,程序也可能崩溃。

3.打印机问题:如果系统中没有可用的打印机或打印机配置不正确,则可能导致崩溃。

您可以尝试使用调试器来确定具体的崩溃原因。在slotPintPreview函数的第一行处设置断点,然后单击“打印”按钮,程序将在此处暂停。您可以查看变量的值,查找内存泄漏或指针问题。如果没有找到问题,请尝试检查打印机配置。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据你提供的代码和描述,可能是因为在调试模式下,程序使用的内存比非调试模式下更多,从而导致内存不足,进而导致程序崩溃。尝试在打开打印对话框之前将一些不必要的资源释放,以减少内存使用。

你可以尝试在打印对话框执行之前调用QCoreApplication::processEvents()方法,它可以让应用程序处理所有未处理的事件,这可能会释放一些资源,从而减少内存使用。例如:

QCoreApplication::processEvents();
QPrintPreviewDialog* pPreviewDialog = new QPrintPreviewDialog(&printer);
// 连接槽函数等操作
pPreviewDialog->resize(1000, 900);
pPreviewDialog->exec();
delete pPreviewDialog;

另外,你可以在slotPintPreview()函数中添加一些日志或调试语句,以便更好地了解程序运行时的情况,从而帮助你定位问题所在。例如:

void HistoryDataWin::slotPintPreview(QPrinter* printer)
{
    qDebug() << "slotPintPreview called.";
    QPainter histPainter;
    //printer->setPageSize(QPrinter::A4);
    int posPos = 0;
    int monitorPos = 0;
    if (histPainter.begin(printer))
    {
        qDebug() << "histPainter begin.";
        paintHist(&histPainter, posPos, monitorPos);
        histPainter.end();
        qDebug() << "histPainter end.";
    }
    else
    {
        qDebug() << "histPainter begin failed.";
    }
}

希望这些信息对你有所帮助,如有任何问题请随时提出。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

可能是因为VS调试模式下,打印机配置没有被正确加载导致程序崩溃。建议尝试下面的解决方案:

  1. 确保已经安装了打印机驱动并且打印机正常运行。
  2. 在打印前,通过QPrinterInfo::availablePrinters()函数获取可用的打印机列表,并手动选择打印机(使用QPrinter::setPrinterName()方法)。
  3. 在程序代码中显式加载打印机配置参数,而不是依赖系统默认值。例如,可以通过QPrinter::setPageLayout()函数设置页面大小和边距。
  4. 尝试使用不同的打印机输出格式(例如PDF或SVG)并检查是否会影响程序崩溃。
  5. 确保在VS调试设置中选择了正确的Qt版本和编译器,并尝试重新生成程序以重新解决依赖问题。