
QT17 - 对话框及其类型 QDialog
发布日期:2021-05-07 13:26:05
浏览次数:12
分类:原创文章
本文共 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();}
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月22日 02时52分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
YbtOJ 递推算法课堂过关 例5 平铺方案【递推(简单DP)】
2019-03-04
YbtOJ hash和hash表课堂过关 例1 字符串哈希【hash】
2019-03-04
CSUST 2021 周赛 2 题解
2019-03-04
前后端数据交互之表单
2019-03-04
剑指offer JZ15 反转链表
2019-03-04
剑指offer JZ21 栈的压入弹出序列
2019-03-04
剑指offer JZ31 整数中1出现的次数
2019-03-04
实现基于scrapy框架的天气预报爬虫hengYangSpaider @572311文
2019-03-04
maven打包指定名称并去除jar-with-dependencies后缀
2019-03-04
Netty4服务端入门代码示例
2019-03-04
java连接mysql,jdbc驱动
2019-03-04
操作系统前传第六课--开发中的辅助工具
2019-03-04
Linux系统编程44 信号 - 信号的响应过程分析!!!
2019-03-04
VL53L0x TOF激光测距的 stm32 HAL库驱动代码
2019-03-04
怎么玩LOG4J
2019-03-04
Oracle创建用户,分配表空间
2019-03-04
自定义标签(JSP2.0)简单标签
2019-03-04
MyBatis自定义类型转换器
2019-03-04
机器学习(湖北师范大学教程)-极大似然估计算法
2019-03-04
2019年下半年总结
2019-03-04