QT学习笔记(九)实现模态对话框与非模态对话框

实现点击按钮弹出对话框,实现步骤如下:

1. 创建工程,打开ui,做好基础界面,如下:

QT学习笔记(九)实现模态对话框与非模态对话框_第1张图片
其中有一个菜单项叫“new_file”,类型类QAction,(实现方法可以看上一篇或者第七篇),要实现点击它打开对话框。

2. 对话框类型:两类

  • 模态对话框:不可以对其他窗口进行操作,弹出后,无法点击其他窗口,即“阻塞”
  • 非模态对话框:可以对其他窗口进行操作

3. 模态对话框的实现:

3.1代码:

包含库:
#include
#include
#include

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,跳出对话框,必须关掉后才能点窗口其他地方
QT学习笔记(九)实现模态对话框与非模态对话框_第2张图片
关掉对话框后,将输出qDebug的内容:
QT学习笔记(九)实现模态对话框与非模态对话框_第3张图片
关闭前,程序处于阻塞状态,所以不会输出这个内容,关掉后才能够输出。

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,出现一个对话框,即使不关掉对话框,也能操作主窗口
QT学习笔记(九)实现模态对话框与非模态对话框_第4张图片
输出:
QT学习笔记(九)实现模态对话框与非模态对话框_第5张图片

4.3 补充说明

  • 堆区与栈区
    对象创造在lambda表达式里,所以这条语句如果执行完了后,栈上的对象会立马被释放掉(代码里的dlg2只会闪一下就消失),也不会被阻塞,所以要把创建的对象放到堆区,使用new(dlg3会一直存在,直到叉掉它),所以每次点击new file菜单项指挥出现一个对话框。
  • 堆区对象的释放
    堆区新建的对象会等到关闭主程序后才被释放,即把dlg3关掉后,它也不会被释放,那么就有可能出现内存不够的情况,所以需要实现关闭窗口时自动释放,使用setAttribute函数,函数说明如下:
    QT学习笔记(九)实现模态对话框与非模态对话框_第6张图片
    打开WidgetAttribute,可以看到Qt::WA_DeleteOnClose:
    在这里插入图片描述
    字面意思,在close时delete它,那么释放了它,所以对dlg3添加了代码:
    dlg3->setAttribute(Qt::WA_DeleteOnClose);

你可能感兴趣的:(QT学习日记,qt,学习)