当前位置: 首页 > news >正文

QDialog - 对话框

QDialog - 对话框

一. 对话框

  1. 对话框是与用户进行简短交互的顶层窗口

  2. QDialog是Qt中所有对话框

  3. QDialog继承于QWidget是一种容器类组件

QObject QWidget QPaintDevice QDialog
  1. QDialog作为一种专用的交互窗口而存在

  2. 不能作为子部件嵌入其它容器中

  3. 是定制了窗口式样的特殊的QWidget

二. 对话框的特点

  1. 代码 - Widget作为Dialog的父组件时

    #include "Dialog.h"
    
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QWidget w;
        QDialog dl(&w);
    
        dl.setWindowTitle("Dialog");
        dl.show();
    
        w.setWindowTitle("Widget");
        w.show();
    
        return a.exec();
    }
    
    
    

    请添加图片描述

  2. 代码 - Dialog作为Widget的父组件时

    #include "Dialog.h"
    
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
    
        QDialog dl;
        QWidget w(&dl);
    
        dl.setWindowTitle("Dialog");
        dl.show();
    
        w.setWindowTitle("Widget");
        w.show();
    
        return a.exec();
    }
    
    

    请添加图片描述

三. 对话框的类型

  1. 模态对话框

    //显示后无法与父窗口进行交互
    //是一种阻塞式的对话框调用方式
    QDialog::exec();
    

    如下图所示,Qt中的【选项】弹出的对话框就是一种模态对话框,这个对话框弹出来后,点击Qt的主窗口是无法点击的,只能关掉【选项】这个对话框才可以

    请添加图片描述

  2. 非模态对话框

    //显示后独立存在可以同时与父窗口进行交互
    //是一种非阻塞式的对话框调用方式
    QDialog::show();
    

    非模态对话框我们看一下typora【更新】弹出来的这个对话框,弹出后,点击typora主页面不影响和主页面的交互,是一种非模态对话框

    请添加图片描述

四. 实验

  1. 类的声明

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QDialog>
    
    #include <QDialog>
    #include <QPushButton>
    
    //
    class Dialog : public QDialog
    {
        Q_OBJECT
    protected:
        QPushButton ModalBtn;
        QPushButton NormalBtn;
        QPushButton MixedBtn;
    protected slots:
        void ModalBtn_Clicked();
        void NormalBtn_Clicked();
        void MixedBtn_Clicked();
    public:
        Dialog(QWidget *parent = 0);
        ~Dialog();
    };
    #endif // DIALOG_H
    
    
  2. 类的构造

    #include "Dialog.h"
    #include "ui_Dialog.h"
    
    #include "Dialog.h"
    
    #include <QDebug>
    
    Dialog::Dialog(QWidget *parent) :
            QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
    {
        ModalBtn.setText("Modal Dialog");
        ModalBtn.move(20, 20);
        ModalBtn.resize(200, 30);
    
        NormalBtn.setText("Normal Dialog");
        NormalBtn.move(20, 70);
        NormalBtn.resize(200, 30);
    
        MixedBtn.setText("Mixed Dialog");
        MixedBtn.move(20, 120);
        MixedBtn.resize(200, 30);
    
        connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
        connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
        connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
    
        resize(240, 170);
        setFixedSize(width(), height());
    }
    
    Dialog::~Dialog()
    {
        qDebug() << "~Dialog()";
    }
    
  3. 模态对话框 - 在槽函数中实现

    void Dialog::ModalBtn_Clicked()
    {
        qDebug() << "ModalBtn_Clicked() Begin";
    
        QDialog dialog(this);   //模态对话框
        dialog.resize(300, 100);
        dialog.setWindowTitle("Modal Dialog");
    
        dialog.exec();  //显示一个模态对话框,只有模态对话框才有返回值的概念,模态对话框的返回值用于表示交互结果
        dialog.setFixedSize(width(), height());
        // done(Accepted);
    
        qDebug() << "ModalBtn_Clicked() End";
    }
    
    
    

    请添加图片描述

  4. 非模态对话框

    void Dialog::NormalBtn_Clicked()
    {
        qDebug() << "NormalBtn_Clicked() Begin";
    
    #if 0
        QDialog dialog(this);   //非模态对话框在栈区开辟内存空间
        dialog.resize(300, 100);
        dialog.setWindowTitle("Normal Dialog");
        dialog.show();         //因为其没有阻塞的概念,会立即返回
    
    #else
        QDialog* dialog = new QDialog(this);   //非模态对话框没有阻塞的概念,要在堆区开辟内存空间
    //    QDialog* dialog = new Dialog(this);
        dialog->setWindowTitle("Normal Dialog");
        dialog->resize(300, 100);
    
        dialog->setAttribute(Qt::WA_DeleteOnClose); //设置属性,防止内存泄漏
        dialog->show();
    
        // done(Rejected);
    #endif
    
        qDebug() << "NormalBtn_Clicked() End";
    
    }
    
    

    因为非模态对话框没有阻塞的概念,如果在栈区开辟内存空间,根据程序的运行会直接释放掉对话框,对话框只会显示一瞬

    请添加图片描述

    解决方法是,在堆区为非模态对话框申请空间,可以看到非模态对话框可以正常显示,并且没有阻塞其它窗口

    请添加图片描述

  5. 混合类型的对话框 - 使用show()方法即非模态对话框,但是显示出来的属性特点是模态对话框

    void Dialog::MixedBtn_Clicked()
    {
        qDebug() << "MixedBtn_Clicked() Begin";
    
        QDialog* dialog = new QDialog(this);
    
        dialog->setWindowTitle("Mixed Dialog");
        dialog->resize(300, 100);
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        dialog->setModal(true);    //设置非模态对话框,表现为模态对话框
        dialog->show();
    
        // done(100);
    
        qDebug() << "MixedBtn_Clicked() End";
    }
    
    

    请添加图片描述

  6. main函数的内容

    #include "Dialog.h"
    
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        Dialog dl;
        dl.show();
    
        return a.exec();
    }
    

相关文章:

  • 登录对话框的设计和实现
  • Qt中的标准对话框
  • 布局管理器
  • Qt工程添加资源文件(例如:图标)
  • 主窗口 (QMainWindow)
  • C++中的explicit
  • Qt中的事件处理
  • 使用二阶构造实现计算器页面的构造过程
  • Linux内核的CodingStyle
  • 常见面试题及面试准备阶段要思考的问题
  • Qt中事件的传递过程
  • Qt事件初探-发现事件
  • Qt中TCP通信的实现
  • ubuntu下MQTT的移植安装
  • MQTT协议 发布/订阅 机制初探 - (模拟物联网传感器设备和控制模块间的通信)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 2019年如何成为全栈工程师?
  • AngularJS指令开发(1)——参数详解
  • Apache Spark Streaming 使用实例
  • Apache的80端口被占用以及访问时报错403
  • Codepen 每日精选(2018-3-25)
  • Cumulo 的 ClojureScript 模块已经成型
  • JAVA SE 6 GC调优笔记
  • LeetCode18.四数之和 JavaScript
  • ng6--错误信息小结(持续更新)
  • Redis的resp协议
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 检测对象或数组
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 设计模式 开闭原则
  • 算法---两个栈实现一个队列
  • 想写好前端,先练好内功
  • 小程序开发中的那些坑
  • 组复制官方翻译九、Group Replication Technical Details
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #HarmonyOS:Web组件的使用
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #pragma pack(1)
  • #预处理和函数的对比以及条件编译
  • (02)vite环境变量配置
  • (a /b)*c的值
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)用.Net的File控件上传文件的解决方案
  • (轉)JSON.stringify 语法实例讲解
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .htaccess配置重写url引擎
  • .Net Core和.Net Standard直观理解
  • .net framework profiles /.net framework 配置
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /usr/bin/env: node: No such file or directory