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

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

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);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值