【问题标题】:QMessageBox delete on closeQMessageBox 关闭时删除
【发布时间】:2015-01-11 14:05:21
【问题描述】:

我有一个问题对你们中的一些人来说有明显的答案,但我就是想不通。

QMessageBox http://qt-project.org/doc/qt-5/qmessagebox.html 有两种显示方式,要么您执行 exec() 停止程序执行直到用户关闭消息框,要么 show() 仅显示框(可能在单独的线程中或以某种方式允许程序在盒子等待用户时继续运行)。

使用 show() 后如何删除框?

此代码立即关闭它,消息框出现纳秒然后消失:

QMessageBox *mb = new QMessageBox(parent);
mb->setWindowTitle(title);
mb->setText(text);
mb->show();
delete mb; // obvious, we delete the mb while it was still waiting for user, no wonder it's gone

这段代码也是这样

QMessageBox mb(parent);
mb.setWindowTitle(title);
mb.setText(text);
mb.show();
// obvious, as we exit the function mb which was allocated on stack gets deleted

这段代码也是如此

QMessageBox *mb = new QMessageBox(parent);
mb->setWindowTitle(title);
mb->setText(text);
mb->show();
mb->deleteLater(); // surprisingly this doesn't help either

那么我怎样才能正确地使用 show() 而不必以某种复杂的方式处理它的删除呢?是否有类似deleteOnClose() 的函数会告诉它在用户关闭它后自行删除?

【问题讨论】:

    标签: c++ qt qmessagebox


    【解决方案1】:

    你可以使用Qt::WA_DeleteOnClose标志

    QMessageBox *mb = new QMessageBox(parent);
    mb->setAttribute(Qt::WA_DeleteOnClose, true);
    mb->setWindowTitle(title);
    mb->setText(text);
    mb->show();
    

    【讨论】:

      【解决方案2】:

      是的,Qt 中有一个“关闭时删除”的概念,因此您可以配置消息框以遵循这种行为:

      mb->setAttribute(Qt::WA_DeleteOnClose);
      

      【讨论】:

        【解决方案3】:

        您可以使用以下内容:

        QMessageBox* msg = new QMessageBox;
        msg->setWindowTitle(title);
        msg->setText(text);
        connect(msg, SIGNAL(done(int)), msg, SLOT(deleteLater()));
        msg->show();
        

        这样,当它关闭并且事件循环无事可做时,它将销毁。

        【讨论】:

          猜你喜欢
          • 2014-12-25
          • 2011-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-02
          • 2014-05-29
          • 1970-01-01
          相关资源
          最近更新 更多