【问题标题】:Wait until QWidget closes等到 QWidget 关闭
【发布时间】:2009-05-02 18:52:15
【问题描述】:

我正在使用 C++ 和 QT 开发一个项目,我想打开一个新的 QWidget 窗口,让用户与之交互等,然后让执行返回到打开窗口的方法。示例(MyClass 继承 QWidiget):

void doStuff(){

     MyClass newWindow = new Myclass();
     /* 
        I don't want the code down here to 
        execute until newWindow has been closed
      */
}

我觉得很可能有一种非常简单的方法可以做到这一点,但由于某种原因我无法弄清楚。我该怎么做?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    MyClass 继承QDialog。然后使用exec() 将其作为模态对话框打开。

    void MainWindow::createMyDialog()
    {
      MyClass dialog(this);
      dialog.exec();
    }
    

    查看http://qt-project.org/doc/qt-4.8/qdialog.html

    【讨论】:

    • 使用 QDialog 有副作用 - 默认情况下它的呈现方式不同,并且 Escape 键将其关闭。我相信@56ka 的回答可以避免这种情况。
    • 如果其他人想使用setModal()show(),下面是doc.qt.io/qt-5/qdialog.html#modal-dialogs 所说的: “显示模式对话框的最常见方法是调用它的 exec( ) 函数。(...) 另一种方法是调用 setModal(true) 或 setWindowModality(),然后调用 show()。与 exec() 不同,show() 立即将控制权返回给调用者。"
    • Qt5 文档说要避免使用QDialog::exec()。所以这个答案不再是最佳实践(如果曾经是)。
    【解决方案2】:

    另一种方法是使用等待关闭事件的循环:

    #include <QEventLoop>
    
    void doStuff()
    {
        // Creating an instance of myClass
        MyClass myInstance;
        // (optional) myInstance.setAttribute(Qt::WA_DeleteOnClose);  
        myInstance.show();
    
        // This loop will wait for the window is destroyed
        QEventLoop loop;
        connect(this, SIGNAL(destroyed()), & loop, SLOT(quit()));
        loop.exec();
    }
    

    【讨论】:

      【解决方案3】:

      为什么不把你不想在窗口关闭之前执行的代码放在一个单独的函数中,并将其连接为SLOT 以关闭窗口SIGNAL

      【讨论】:

      • 谢谢,这听起来是个好主意。我该怎么做?我从未对信号/插槽进行硬编码,仅通过 QTDesigner 使用它们。
      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多