首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt PrintPreviewDialog,点击打印按钮,程序崩溃的原因是什么?

Qt PrintPreviewDialog,点击打印按钮,程序崩溃的原因是什么?
EN

Stack Overflow用户
提问于 2013-09-13 16:51:17
回答 3查看 1.9K关注 0票数 0

我得到了以下代码:

代码语言:javascript
运行
复制
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对话框,但在我的主项目中,当我按下按钮时,预览成功启动,但当我按下“打印”按钮时,我的程序就崩溃了。上面写着“你的程序停止工作了,windows会搜索解决方案”或者类似的东西。我需要说的是,我的程序有很多类和对话框。我几乎可以肯定指针有问题。我没有太多的经验,所以我就是找不到我的错误在哪里。请看我的代码,告诉我我应该做什么,因为我只有2天的时间来完成这个项目。在此之前,非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2013-09-13 17:11:55

我认为原因是您在堆栈中创建了打印机对象

代码语言:javascript
运行
复制
[..]
QPrinter printer(QPrinter::HighResolution);
[..]

并将指向它的指针传递给打印预览对话框。一旦对话框在exec()下运行,您的打印机对象仍然是活动的,但是当您关闭对话框时,您退出了Test1::on_pushButton_1_clicked()函数,因此打印机对象被销毁。进一步引用它会导致崩溃。作为一种解决方案,尝试从堆创建打印机,如下所示:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2013-09-13 21:39:06

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

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

在Qt中,几乎所有的东西都应该被分配到堆上,正是因为这个原因。

票数 0
EN

Stack Overflow用户

发布于 2013-09-15 02:04:00

感谢大家的回答,我终于解决了我的problem.So,我是如何解决它的呢?我刚刚将发布模式更改为调试模式。塔达姆。就是这样。文件稍微大了一点,但谁在乎呢。一切都运行得很好。再次感谢你的回答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18782097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档