当前位置:网站首页>Qt学习17 对话框及其类型
Qt学习17 对话框及其类型
2022-07-03 13:23:00 【一个小黑酱】
Qt学习17 对话框及其类型
对话框的概念
- 对话框是与用户进行简短交互的顶层窗口
- QDialog是Qt中所有多画框窗口的基类
- QDialog继承于QWidget是一种容器类型的组件

- QDialog的意义
- QDialog作为一种专用的交互窗口而存在
- QDialog不能作为子部件嵌入其他容器中
- QDialog是定制了窗口式样的特殊的QWidget
实验1 - QWidget和QDialog的区别
#include "Dialog.h"
#include <QApplication>
#include <QWidget>
#include <QDialog>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
QDialog dialog(&widget); // 虽然dialog设置了父组件,但是dialog依然会是顶层窗口
dialog.show();
dialog.setWindowTitle("I'am dialog");
widget.show();
widget.setWindowTitle("I'am widget");
return a.exec();
}
#include <QApplication>
#include <QWidget>
#include <QDialog>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDialog dialog;
QWidget widget(&dialog); // widget设置了父组件,widget会嵌入dialog中
dialog.show();
dialog.setWindowTitle("I'am dialog");
widget.show();
widget.setWindowTitle("I'am widget");
return a.exec();
}
对话框的类型
模态对话框( QDialog::exec() )
- 显示后无法与父窗口进行交互
- 是一种阻塞式的对话框调用方式
非模态对话框 ( QDialog::show() )
- 显示后独立存在可以同时与父窗口进行交互
- 是一种非阻塞式的对话框调用方式
一般情况
- 模态对话框用于必须依赖用户选择的场合(80%)
- 消息提示,文件选择,打印设置,等
非模态对话框用于特殊功能设置的场合(20%)
- 查找操作,属性设置,等
小技巧
- 在栈上创建模态对话框是最简单常用的方式
- 一般情况下非模态对话框需要在堆上创建
- 通过 QDialog::setModel 函数可以创建混合特性的对话框
- 非模态对话框需要指定 Qt::WA_DeleteOnClose 属性
实验2 - 不同特性的对话框
#ifndef DIALOG_H
#define DIALOG_H
#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
#include "Dialog.h"
#include <QDebug>
// 模态对话框
void Dialog::ModalBtn_clicked()
{
qDebug() << "ModalBtn_clicked() begin";
QDialog dialog(this);
dialog.exec();
qDebug() << "ModalBtn_clicked() end";
}
// 非模态对话框
void Dialog::NormalBtn_clicked()
{
qDebug() << "NormalBtn_clicked() begin";
QDialog *dialog = new QDialog(this); // 非模态对话框不会阻塞程序,必须放在堆上
dialog->setAttribute(Qt::WA_DeleteOnClose); // 为了防止内存泄漏,必须加上这行
dialog->show();
qDebug() << "NormalBtn_clicked() end";
}
// 混合属性对话框
void Dialog::MixedBtn_clicked()
{
qDebug() << "MixedBtn_clicked() begin";
QDialog *dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setModal(this); // 混合属性对话框就是在非模态对话框的基础上
dialog->show();
qDebug() << "MixedBtn_clicked() end";
}
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);
}
Dialog::~Dialog()
{
qDebug() << "~Dialog()";
}
#include "Dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dlg;
dlg.show();
return a.exec();
}
对话框的返回值
- 只有模态对话框才有返回值的概念
- 模态对话框的返回值用于表示交互结果
- QDialog::exec() 的返回值为交互结果
- void QDialog::done(int i) 关闭对话框并将参数作为交互结果
- QDialog::Accepted - 用户操作成功
- QDialog::Rejected - 用户操作失败
实验3 - 对话框的返回值
#include "Dialog.h"
#include <QDebug>
void Dialog::ModalBtn_clicked()
{
qDebug() << "ModalBtn_clicked() begin";
done(Accepted);
qDebug() << "ModalBtn_clicked() end";
}
void Dialog::NormalBtn_clicked()
{
qDebug() << "NormalBtn_clicked() begin";
done(Rejected);
qDebug() << "NormalBtn_clicked() end";
}
void Dialog::MixedBtn_clicked()
{
qDebug() << "MixedBtn_clicked() begin";
done(100);
qDebug() << "MixedBtn_clicked() end";
}
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);
}
Dialog::~Dialog()
{
qDebug() << "~Dialog()";
}
#include "Dialog.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dlg;
int r = dlg.exec();
if (r == QDialog::Accepted) {
qDebug() << "QDialog::Accepted";
}
else if (r == QDialog::Rejected) {
qDebug() << "QDialog::Rejected";
}
else {
qDebug() << r;
}
return r;
}
头文件使用实验2中的头文件。
小结
- 对话框分为模态对话框和非模态对话框
- 模态对话框是阻塞式的
- 模态对话框用于以来用户交互结果的场合
- 非模态对话框是非阻塞式的
- 非模态对话框用于功能设置的场合
边栏推荐
- 双向链表(我们只需要关注插入和删除函数)
- Software testing is so hard to find, only outsourcing offers, should I go?
- Resolved (error in viewing data information in machine learning) attributeerror: target_ names
- windos 创建cordova 提示 因为在此系统上禁止运行脚本
- Windos creates Cordova prompt because running scripts is prohibited on this system
- GoLand 2021.1: rename the go project
- [redis] cache warm-up, cache avalanche and cache breakdown
- Go language web development series 26: Gin framework: demonstrates the execution sequence of code when there are multiple middleware
- NFT新的契机,多媒体NFT聚合平台OKALEIDO即将上线
- GoLand 2021.1.1: configure the multi line display of the tab of the open file
猜你喜欢

刚毕业的欧洲大学生,就能拿到美国互联网大厂 Offer?

Go language web development series 26: Gin framework: demonstrates the execution sequence of code when there are multiple middleware
![Mysql:insert date:SQL 错误 [1292] [22001]: Data truncation: Incorrect date value:](/img/2f/33504391a661ecb63d42d75acf3a37.png)
Mysql:insert date:SQL 错误 [1292] [22001]: Data truncation: Incorrect date value:

Students who do not understand the code can also send their own token, which is easy to learn BSC

Mobile phones and computers can be used, whole people, spoof code connections, "won't you Baidu for a while" teach you to use Baidu

CVPR 2022 | 美团技术团队精选6篇优秀论文解读

Go language unit test 3: go language uses gocovey library to do unit test

Go language web development series 28: solve cross domain access of CORS with gin contrib / CORS

使用tensorflow进行完整的DNN深度神经网络CNN训练完成图片识别案例

MySQL 数据增删改查综合案例
随机推荐
[技術發展-24]:現有物聯網通信技術特點
SQL Injection (GET/Select)
php 迷宫游戏
太阳底下无新事,元宇宙能否更上层楼?
Can newly graduated European college students get an offer from a major Internet company in the United States?
[technology development-24]: characteristics of existing IOT communication technology
Mobile phones and computers can be used, whole people, spoof code connections, "won't you Baidu for a while" teach you to use Baidu
Mycms we media mall v3.4.1 release, user manual update
Comprehensively develop the main channel of digital economy and digital group, and actively promote the utonmos digital Tibet market
logback日志的整理
物联网毕设 --(STM32f407连接云平台检测数据)
Richview trvstyle liststyle list style (bullet number)
[how to solve FAT32 when the computer is inserted into the U disk or the memory card display cannot be formatted]
Heap structure and heap sort heapify
The reasons why there are so many programming languages in programming internal skills
Students who do not understand the code can also send their own token, which is easy to learn BSC
Use docker to build sqli lab environment and upload labs environment, and the operation steps are provided with screenshots.
[机缘参悟-37]:人感官系统的结构决定了人类是以自我为中心
Record 405 questions about bank callback post request
ThreadPoolExecutor realizes multi-threaded concurrency and obtains the return value (elegant and concise way)