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();
}
我也遇到过同样的问题,是因为打印机的库没安装好。楼主可以从这个角度尝试下看能否解决。
你的这些代码前后不完整看不出具体哪里的错误,我怀疑paintHist函数可能有问题,把paintHist代码粘出来看看。
试一下:
直接
1、QPainter histPainter(printer);
注释掉 begin() 和 end();
2、把histPainter 改成 堆变量
QPainter* histPainter=new QPainter;
histPainter->begin(....)
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
从您的描述来看,问题可能出在 histPainter.begin(printer)
这一行。这是因为在调试模式下,应用程序有时会使用不同的内存布局,这可能会导致访问非法内存的错误。这种情况下,可能需要在代码中进行一些调整,以确保在不同的运行模式下都能够正确运行。
下面是一些可能有用的调试技巧:
使用 QPrintDialog
而不是 QPrintPreviewDialog
进行打印。这可以帮助您确定是打印预览对问题的影响,还是与打印机、打印驱动程序等相关的其他问题。
检查 printer
变量是否被正确初始化并包含预期值。例如,对于 printerName()
,可能需要检查默认打印机名称是否正确,可以添加一些输出语句来确认这些值。避免直接调用 printer.setOutputFileName()
或 printer.setOutputFormat()
,因为这会覆盖打印机驱动程序的配置,最好使用默认值。
确保 paintHist
函数正确处理了所有参数值,例如 posPos
和 monitorPos
,并正确地绘制了 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调试模式下,打印机配置没有被正确加载导致程序崩溃。建议尝试下面的解决方案: