已解决
【QT】点击按钮弹出对话框的注意事项
来自网友在路上 170870提问 提问时间:2023-10-29 02:16:06阅读次数: 70
最佳答案 问答题库708位专家为你答疑解惑
在stack区创建对话框对象
模态对话框,不可以对其他窗口进行操作。 模态窗口用dlg.exec()显示窗口。
问题代码1:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//点击新建按钮,弹出一个对话框connect(ui->actionNew, &QAction::triggered, [this](){// 阻塞态对话框,只能有一个QDialog dlg(this); // 在stack区创建 dlgdlg.resize(200,100); //dlg.exec(); // 让窗口对象卡住,点击关闭,关闭窗口。qDebug() << "模态对话框弹出了";});}
对象dlg,在stack区被创建。dlg 的生命周期在Lambda表达式内,当箭头函数结束时,会自动销毁 stack 区内存,窗口一闪即逝。
正确写法,设置exec()函数:
connect(ui->actionNew, &QAction::triggered, [this](){// 阻塞态对话框,只能有一个QDialog dlg(this); // 在stack区创建 dlgdlg.resize(200,100); dlg.exec(); // 让窗口对象卡住,点击关闭,关闭窗口。qDebug() << "模态对话框弹出了";});
dlg.exec()
相当于 while(1)
,让窗口对象持续存在。当手动叉掉对话框时,箭头函数就会结束,并自动销毁 stack 区内存,不会出现内存泄漏。
在堆区创建对话框对象
非模态对话框,可以对其他窗口进行操作。非模态窗口用dlg->show()显示窗口。
问题代码2:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//点击新建按钮,弹出一个对话框connect(ui->actionNew, &QAction::triggered, [this](){// 非模态对话框QDialog *dlg2 = new QDialog(this);dlg2->resize(200,100);dlg2->show();qDebug() << "非模态对话框弹出了";});}
程序不会报错,运行结果和上图差不多。
但是,由于dlg2
在堆区创建,当箭头函数结束时,堆区内存不会被自动释放。因此对话框会持续保留,不需要exec()函数卡住程序。
又因为dlg2
是非模态对话框,可以无限创建。理论上讲,只要用户无限点击几天时间,就会占用大量堆区的内存。只要主程序没有结束,对象树的自动析构就不会起作用,即使叉掉对话框,也不会释放。这是一个重大的安全隐患。
正确写法,设置Qt::WA_DeleteOnClose
属性:
connect(ui->actionNew, &QAction::triggered, [this](){// 非模态对话框QDialog *dlg2 = new QDialog(this);dlg2->resize(200,100);dlg2->show();dlg2->setAttribute(Qt::WA_DeleteOnClose); //55号属性qDebug() << "非模态对话框弹出了";});
未设置该属性时,你去关闭窗口,窗口资源不会立即释放,窗口只是"隐藏"了。当调用析构函数时,窗口资源才会真正释放。设置该属性后,我们关闭窗口,窗口资源会立即释放。
完整的示例代码
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//点击新建按钮,弹出一个对话框connect(ui->actionNew, &QAction::triggered, [this](){// 阻塞态对话框QDialog dlg(this);dlg.resize(200,100);dlg.exec();qDebug() << "模态对话框弹出了";// 非模态对话框QDialog *dlg2 = new QDialog(this);dlg2->resize(200,100);dlg2->show();dlg2->setAttribute(Qt::WA_DeleteOnClose); //55号属性qDebug() << "非模态对话框弹出了";});
}
参考连接:
setAttribute(Qt::WA_DeleteOnClose) 导致程序崩溃问题
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"【QT】点击按钮弹出对话框的注意事项":http://eshow365.cn/6-27319-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 20231028刷题记录
- 下一篇: 037-第三代软件开发-系统音量设置