博客
关于我
QT17 - 对话框及其类型 QDialog
阅读量:335 次
发布时间:2019-03-04

本文共 3595 字,大约阅读时间需要 11 分钟。

本文学习自 狄泰软件 唐佐林老师的 QT课程。


QDialog是QT中所有对话框的基类,QDialog继承于QWidget 是一种容器类型的组件,QDialog 对象 只能 必须 作为顶层的窗口而存在,不能作为子部件嵌入其他容器中,QDialog是定制了窗口样式的特殊的 QWidget。而QDialog 与 QWidget的区别也就是, QDialog 只能 作为顶层的窗口,而QWidget不是。

QDialog可以创建:

1 模态对话框: 阻塞式对话框,在栈上创建,显示后 无法与父窗口交互,一直位于顶层

QDialog::exec() ,创建模态对话框,注意在栈上创建 QDialog对象只有模态对话框 有返回值概念,表示交互结果QDialog::done(int i) :关闭对话框,并将参数作为交换结果参数为:Accepted :用户操作成功参数为:Rejected  :用户操作失败具体值:其他

2 非模态对话框:非阻塞式对话框,在堆上创建,显示后,可以与父窗口交互

QDialog* dialog = new QDialog(this); 注意在堆上创建 QDialog对象,并指定父子关系,指定父组件,这样组件会一直在父组件上Qt::WA_DeleteOnClose :需要设置 属性 释放资QDialog::show() 可以与父组件交互,需要设置父组件this,才会一直位于父组件上面

3 混合态对话框 : 程序不阻塞,但是对话框阻塞,显示后无法与父窗口进行交互

Qt::WA_DeleteOnClose :需要设置 属性 释放资       QDialog::setModal(true);//设置混合特性对话框属性,创建 混合态对话框。       QDialog::show();

实验 :QDialog 模态,非模态,混合态 对话框 使用

头文件:

#ifndef DIALOG_H#define DIALOG_H#include <QtGui/QDialog>#include <QPushButton>class Dialog : public QDialog{    Q_OBJECTprotected:    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

创建 模态对话框,非模态对话框(非阻塞对话框,混合特性对话框)

Dialog.cpp#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(100, 30);    NormalBtn.setText("Normal Dialog");    NormalBtn.move(20, 70);    NormalBtn.resize(100, 30);    MixedBtn.setText("Mixed Dialog");    MixedBtn.move(20, 120);    MixedBtn.resize(100, 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(140, 170);}void Dialog::ModalBtn_Clicked(){    qDebug() << "ModalBtn_Clicked() Begin";    /*       QDialog dialog(this); 一般都是这样写,设定其父组件是主窗口,这样该组件就可以一直显示在其父组件上面。       QDialog dialog;这样写也可以,因为此处将要创建的对话框dialog是 模态对话框,是阻塞式对话框,不论指不指定其父组件,效果都是模态对话框在顶层。    */    QDialog dialog(this);    dialog.exec(); //创建模态对话框    // done(Accepted);    qDebug() << "ModalBtn_Clicked() End";}void Dialog::NormalBtn_Clicked(){    qDebug() << "NormalBtn_Clicked() Begin";    /*       非模态对话框 是非阻塞式对话框,如果在栈上创建,那么在对话框 dialog.show() 显示之后,不会阻塞停留,依旧会向下运行,程序运行结束,       局部变量被释放,dialog被销毁,对话框一闪而逝。    QDialog dialog;    dialog.show();     */    /*       非模态对话框 在堆上创建,避免一闪而过。       dialog->setAttribute(Qt::WA_DeleteOnClose);设置对话框关闭释放资源属性,如果不设置该属性,则dialog指针会在程序结束后释放,而指向的空间被泄露。        为非模态对话框设置 Qt::WA_DeleteOnClose 属性,会在对话框关闭时候 自己释放所占用的内存空间,避免内存泄漏       new QDialog(this); 指定其父组件,使该对话框一直位于其父组件之上。这里不是阻塞式对话框,需要强制指定,否则父组件被点击时,会在该组件之上。    */    QDialog* dialog = new QDialog(this);    dialog->setAttribute(Qt::WA_DeleteOnClose);    dialog->show();    // done(Rejected);    qDebug() << "NormalBtn_Clicked() End";}void Dialog::MixedBtn_Clicked(){    qDebug() << "MixedBtn_Clicked() Begin";    QDialog* dialog = new QDialog(this);    dialog->setAttribute(Qt::WA_DeleteOnClose);//非阻塞是对话框都需要设置 WA_DeleteOnClose属性    //混合特性对话框特点:程序不阻塞,但是对话框阻塞,显示后无法与父窗口进行交互    dialog->setModal(true);//设置混合特性对话框属性,创建 混合态对话框。    dialog->show();    // done(100);    qDebug() << "MixedBtn_Clicked() End";}Dialog::~Dialog(){    qDebug() << "~Dialog()";}

main.cpp

#include <QtGui/QApplication>#include <QWidget>#include <QDialog>#include <QDebug>#include "Dialog.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    Dialog dlg;    dlg.show();//显示对话框    return a.exec();}

在这里插入图片描述

转载地址:http://lxme.baihongyu.com/

你可能感兴趣的文章
做做Java
查看>>
攻防世界新手区pwn
查看>>
2020-2021新技术讲座课程
查看>>
Linux服务器搭建常见开发环境
查看>>
GIT简介
查看>>
eclipse github团队成员修改工程后push推送
查看>>
Mybatis-Plus之@TableField字段
查看>>
shell中的数学运算
查看>>
shell 数学运算
查看>>
如何使用4G模块通过MQTT协议传输温湿度数据到onenet
查看>>
图解:网络硬件的发展史
查看>>
vue项目配置文件vue.config.js中devServer.proxy 使用说明
查看>>
map的find函数和count函数
查看>>
C++并发与多线程(一)
查看>>
C++ 并发与多线程(五)
查看>>
STM32--USART串口收发数据
查看>>
逆合成孔径雷成像(一)— 傅里叶变换基础1
查看>>
elf格式静态链接和动态链接
查看>>
openthread编译错误:error: could not find ctags
查看>>
7628 EDCCA认证寄存器修改(认证自适应)
查看>>