当前位置:网站首页>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中的头文件。
小结
- 对话框分为模态对话框和非模态对话框
- 模态对话框是阻塞式的
- 模态对话框用于以来用户交互结果的场合
- 非模态对话框是非阻塞式的
- 非模态对话框用于功能设置的场合
边栏推荐
- Go 1.16.4: manage third-party libraries with Mod
- 【电脑插入U盘或者内存卡显示无法格式化FAT32如何解决】
- Conversion function and explicit
- Leetcode-1175.Prime Arrangements
- Comprehensively develop the main channel of digital economy and digital group, and actively promote the utonmos digital Tibet market
- Complete DNN deep neural network CNN training with tensorflow to complete image recognition cases
- [机缘参悟-37]:人感官系统的结构决定了人类是以自我为中心
- 太阳底下无新事,元宇宙能否更上层楼?
- 使用tensorflow进行完整的DNN深度神经网络CNN训练完成图片识别案例
- Screenshot of the operation steps of upload labs level 4-level 9
猜你喜欢

Use and design of Muduo buffer class

Go language unit test 5: go language uses go sqlmock and Gorm to do database query mock

Flutter dynamic | fair 2.5.0 new version features

SQL Injection (POST/Select)

SQL Injection (AJAX/JSON/jQuery)

Kivy教程之 如何自动载入kv文件

MySQL 数据处理值增删改

Students who do not understand the code can also send their own token, which is easy to learn BSC
[email protected] chianxin: Perspective of Russian Ukrainian cyber war - Security confrontation and sanctions g"/>Start signing up CCF C ³- [email protected] chianxin: Perspective of Russian Ukrainian cyber war - Security confrontation and sanctions g

物联网毕设 --(STM32f407连接云平台检测数据)
随机推荐
CVPR 2022 | 美团技术团队精选6篇优秀论文解读
使用vscode查看Hex或UTF-8编码
Asp. Net core1.1 without project JSON, so as to generate cross platform packages
Dynamic programming 01 knapsack and complete knapsack
The shadow of the object at the edge of the untiy world flickers, and the shadow of the object near the far point is normal
使用Tensorflow进行完整的深度神经网络CNN训练完成图片识别案例2
太阳底下无新事,元宇宙能否更上层楼?
CVPR 2022 | interpretation of 6 excellent papers selected by meituan technical team
Go language web development series 28: solve cross domain access of CORS with gin contrib / CORS
IBEM 数学公式检测数据集
Go language web development series 27: Gin framework: using gin swagger to implement interface documents
AI 考高数得分 81,网友:AI 模型也免不了“内卷”!
Unity EmbeddedBrowser浏览器插件事件通讯
掌握Cypress命令行选项,是真正掌握Cypress的基础
8 Queen question
IBEM mathematical formula detection data set
untiy世界边缘的物体阴影闪动,靠近远点的物体阴影正常
栈应用(平衡符)
软件测试工作那么难找,只有外包offer,我该去么?
Setting up remote links to MySQL on Linux