根据我的理解,使对话框无模式,你必须在堆上分配它。通过做这样的事情:
MyDialog* dlg = new MyDialog(this);
dlg->show();
dlg->raise();
因为exec()忽略了Modal属性。但是现在存在内存泄漏,因为在应用程序关闭之前,dlg指针不会释放内存。我在页面末尾找到了一个解决方案http://tinf2.vub.ac.be/~dvermeir/manuals/KDE20Development-html/ch08lev1sec3.html#ch08list09,并想知道是否有一个不那么繁琐的方式使用无模型对话框。
答案 0 :(得分: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();
}
答案 1 :(得分:2)
我使用finished计划在deleteLater工作时将其删除:
void MyDialog::MyDialog(QWidget *parent) {
// ...
connect(this, SIGNAL(finished(int)), SLOT(deleteLater)));
}
这种方法将阻止您在发出finished
信号后检查它(除非您可以保证在实际执行删除操作之前所有访问都返回到事件循环之前)。
答案 2 :(得分:2)
就个人而言,我会选择使用
dlg->setAttribute(Qt::WA_DeleteOnClose);
或使对话框成为动态分配成员,即仅创建一次:
// constructor
: dialog_(0)
// member function
{
if (! dialog_)
dialog_ = new MyDialog(this);
dialog_->show();
dialog_->raise();
}
这样,当父对象死亡时,对话框就会被删除,只需要构造一次。