0

我有以下代码:

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 天的时间来完成该项目。非常感谢您。

4

3 回答 3

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();
}
于 2013-09-13T09:11:55.283 回答
0

感谢大家的回答,终于解决了我的问题。那我是怎么解决的呢?我刚刚将发布模式更改为调试模式。塔达姆。而已。该文件更大一些,但谁在乎。一切都很好。再次感谢您的回答。

于 2013-09-14T18:04:00.323 回答
0

想想这个程序的流程,你就会明白为什么它不起作用。

  1. 您在堆栈上制作一台打印机,然后将信号连接到它。
  2. 显示打印对话框,允许用户对其执行任何操作。
  3. 按下一个外部事件,如打印按钮,关闭打印对话框并销毁堆栈上的打印机,因为它超出了范围。
  4. print插槽现在在以前的位置具有无效的内存空间,并使QPrinter*您的整个程序崩溃。

在 Qt 中,正是由于这个原因,大多数东西都应该在堆上分配。

于 2013-09-13T13:39:06.427 回答