实现点击按钮弹出对话框,实现步骤如下:
1. 创建工程,打开ui,做好基础界面,如下:
其中有一个菜单项叫“new_file”,类型类QAction,(实现方法可以看上一篇或者第七篇),要实现点击它打开对话框。
2. 对话框类型:两类
- 模态对话框:不可以对其他窗口进行操作,弹出后,无法点击其他窗口,即“阻塞”
- 非模态对话框:可以对其他窗口进行操作
3. 模态对话框的实现:
3.1代码:
包含库:
#include <QAction>
#include <QDebug>
#include <QDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->actionnew_file,&QAction::triggered,this,[=](){
//模态对话框:
QDialog dlg(this);
dlg.exec();
qDebug()<<"模态对话框";
});
}
3.2 效果:
点击new file,跳出对话框,必须关掉后才能点窗口其他地方
关掉对话框后,将输出qDebug的内容:
关闭前,程序处于阻塞状态,所以不会输出这个内容,关掉后才能够输出。
3.3 补充说明:
connect
采用的是lambda表达式实现的,lambda表达式使用见第六篇笔记
4. 非模态对话框
4.1 代码
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->actionnew_file,&QAction::triggered,this,[=](){
//非模态对话框:可以对其他窗口进行操作
QDialog dlg2(this);
dlg2.show();
qDebug()<<"非模态对话框-栈区";
QDialog *dlg3=new QDialog(this);
dlg3->show();
dlg3->setAttribute(Qt::WA_DeleteOnClose);
qDebug()<<"非模态对话框-堆区";
});
}
4.2 效果:
点击new file,出现一个对话框,即使不关掉对话框,也能操作主窗口
输出:
4.3 补充说明
- 堆区与栈区
对象创造在lambda表达式里,所以这条语句如果执行完了后,栈上的对象会立马被释放掉(代码里的dlg2只会闪一下就消失),也不会被阻塞,所以要把创建的对象放到堆区,使用new(dlg3会一直存在,直到叉掉它),所以每次点击new file菜单项指挥出现一个对话框。 - 堆区对象的释放
堆区新建的对象会等到关闭主程序后才被释放,即把dlg3关掉后,它也不会被释放,那么就有可能出现内存不够的情况,所以需要实现关闭窗口时自动释放,使用setAttribute
函数,函数说明如下:
打开WidgetAttribute
,可以看到Qt::WA_DeleteOnClose:
字面意思,在close时delete它,那么释放了它,所以对dlg3添加了代码:
dlg3->setAttribute(Qt::WA_DeleteOnClose);