QT从入门到实战x篇_13_模态和非模态对话框创建(对话框建立在栈上运行完即释放、堆上不删除不可释放,对象在栈上及堆上的生命周期问题需弄懂)

接上文:QT从入门到实战x篇_xx_QMainWindow状态栏、铆接部件、核心部件(可以有多个的add、只能有一个的set
本篇主要介绍对话框的相关知识
1. 对话框的概念
很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。

  • Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。
  • QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。
  • 顶层窗口与非顶层窗口的区别: 顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

2. 对话框的分类
对话框分为模态对话框和非模态对话框。
(1)模态对话框:就是会阻塞同一应用程序中其它窗口的输入
模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。

Qt 有两种级别的模态对话框:

  • 应用程序级别的模态: 当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
  • 窗口级别的模态: 该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式。

(2)非模态对话框:例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。

3.模态与非模态的实现

  • 使用QDialog::exec()实现应用程序级别的模态对话框
  • 使用QDialog::open()实现窗口级别的模态对话框
  • 使用QDialog::show()实现非模态对话框。

4.常见的标准对话框类型
所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。
这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。
Qt 的内置对话框大致分为以下几类:

  • QColorDialog: 选择颜色;
  • QFileDialog: 选择文件或者目录;
  • QFontDialog: 选择字体;
  • QInputDialog: 允许用户输入一个值,并将其值返回;
  • QMessageBox: 模态对话框,用于显示信息、询问问题等;
  • QPageSetupDialog: 为打印机提供纸张相关的选项;
  • QPrintDialog: 打印机配置;
  • QPrintPreviewDialog:打印预览;
  • QProgressDialog: 显示操作过程。

概念看完之后我们一起来看看代码实现过程。

5.模态对话框与非模态对话框的实现

在上篇中,我们创建了“新建”等菜单栏,但是菜单栏并未连接槽函数。下面展示如何在单击下调出一个模态对话框:
(1)模态对话框:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //点击“新建”按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){
      //创建QDialog对象 放在当前对象的对象树下
        QDialog dlg(this);

      //利用.exec()进行阻塞
        dlg.exec();
    });
}

在这里插入图片描述
(2)非模态对话框:

    //非模态对话框 建在栈上会一闪而过 建立在堆上一直存活
    QDialog* dlg2=new QDialog(this);
    dlg2->show();
    //当点击对话框的close,即可释放
    dlg2->setAttribute(Qt::WA_DeleteOnClose);

在这里插入图片描述
6.学习视频地址:模态和非模态对话框创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值