Qt无模式对话销毁

Nic*_*yev 5 qt qt4

根据我的理解,使对话框无模式,你必须在堆上分配它.通过做这样的事情:

MyDialog* dlg = new MyDialog(this);
dlg->show();
dlg->raise();
Run Code Online (Sandbox Code Playgroud)

因为exec()忽略了Modal属性.但是现在存在内存泄漏,因为在应用程序关闭之前,dlg指针不会释放内存.我在页面末尾找到了一个解决方案http://tinf2.vub.ac.be/~dvermeir/manuals/KDE20Development-html/ch08lev1sec3.html#ch08list09,并想知道是否有一个不那么麻烦的方式有Modeless对话框.

ale*_*sdm 5

您可以使用属性Qt :: WA_DeleteOnClose在关闭/隐藏窗口时销毁窗口,并使用静态变量QWeakPointer(或QPointer)来跟踪打开它的槽/函数内窗口的存在:

void MyWindow::openDialog() {    
    static QWeakPointer<MyDialog> dlg_;
    if (!dlg_)
        dlg_ = new MyDialog(this);

    MyDialog *dlg = dlg_.data();
    dlg->setAttribute(Qt::WA_DeleteOnClose);
    dlg->show();
    dlg->raise();
    dlg->activateWindow();
}
Run Code Online (Sandbox Code Playgroud)


Kal*_*son 2

我会使用deleteLater安排在工作完成后将其删除:

void MyDialog::MyDialog(QWidget *parent) {
    // ...
    connect(this, SIGNAL(finished(int)), SLOT(deleteLater)));
}
Run Code Online (Sandbox Code Playgroud)

finished这种方法将阻止您在发出信号后检查它(除非您可以保证在实际执行删除时所有内容都返回到事件循环之前发生任何访问)。