我有以下代码:
void Test1::on_pushButton_1_clicked() // print the information
{
QPrinter printer(QPrinter::HighResolution);
printer.setCreator("Me");
printer.setDocName("Print");
printer.setPaperSize(QPrinter::A4);
QPrintPreviewDialog *pd = new QPrintPreviewDialog(&printer);
connect(pd,SIGNAL(paintRequested(QPrinter*)),this,SLOT(print(QPrinter*)));
pd->exec();
}
void Test1::print(QPrinter *p)
{
QPainter painter(p);
painter.setPen(Qt::blue);
painter.setRenderHints(QPainter::Antialiasing |
QPainter::TextAntialiasing |
QPainter::SmoothPixmapTransform, true);
painter.drawText(100, 100, "Name: ");
painter.drawText(300, 100, "SuperMan");
}
它适用于我的实验项目,只有1个类[1对话框],但在我的主项目中,当我按下按钮时,预览成功启动,但是当我按下“打印”按钮时,我的程序崩溃了。它说“你的程序停止工作,windows将搜索解决方案”或类似的东西。 我需要说我的程序有很多类和对话框。 我几乎可以肯定指针存在问题。 我没有很多经验,所以我找不到我的错误。 请查看我的代码并告诉我应该怎么做因为我还有2天才能完成该项目。 非常感谢你提前。
答案 0 :(得分:1)
我认为原因是您在堆栈中创建了打印机对象
[..]
QPrinter printer(QPrinter::HighResolution);
[..]
并将指针传递给打印预览对话框。一旦对话框运行exec()
您的打印机对象仍然存在,但是当您关闭对话框时,退出Test1::on_pushButton_1_clicked()
功能,因此打印机对象被破坏。进一步参考它会导致崩溃。
作为解决方案尝试从堆创建您的打印机:
void Test1::on_pushButton_1_clicked() // print the information
{
// This printer should be deleted later.
QPrinter *printer = new QPrinter(QPrinter::HighResolution);
printer->setCreator("Me");
printer->setDocName("Print");
printer->setPaperSize(QPrinter::A4);
QPrintPreviewDialog *pd = new QPrintPreviewDialog(printer);
connect(pd, SIGNAL(paintRequested(QPrinter*)), this, SLOT(print(QPrinter*)));
pd->exec();
}
答案 1 :(得分:0)
想想这个程序的流程,你会明白为什么它不起作用。
print
广告位现在的内存空间无效,而QPrinter*
曾经存在,并导致整个程序崩溃。在Qt中,出于这个原因,大多数应该在堆上分配。
答案 2 :(得分:0)
感谢大家的回答,最后我解决了我的问题。那我是怎么解决的?我刚刚将Release模式更改为Debug模式。 Tadaaam。而已。文件更大一点,但谁在乎。一切都很好。非常感谢您的回答。