当前位置:网站首页>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中的头文件。
小结
- 对话框分为模态对话框和非模态对话框
- 模态对话框是阻塞式的
- 模态对话框用于以来用户交互结果的场合
- 非模态对话框是非阻塞式的
- 非模态对话框用于功能设置的场合
边栏推荐
- Heap structure and heap sort heapify
- 研发团队资源成本优化实践
- 树的深入和广度优先遍历(不考虑二叉树)
- Flutter dynamic | fair 2.5.0 new version features
- 【被动收入如何挣个一百万】
- AI scores 81 in high scores. Netizens: AI model can't avoid "internal examination"!
- Mobile phones and computers can be used, whole people, spoof code connections, "won't you Baidu for a while" teach you to use Baidu
- There is nothing new under the sun. Can the meta universe go higher?
- SQL Injection (POST/Select)
- Go 1.16.4: purpose of go mod tidy
猜你喜欢

8 Queen question

Error running 'application' in idea running: the solution of command line is too long

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

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

GoLand 2021.1: rename the go project

CVPR 2022 | 美团技术团队精选6篇优秀论文解读
![[understanding by chance-37]: the structure of human sensory system determines that human beings are self-centered](/img/06/b71b505c7072d540955fda6da1dc1b.jpg)
[understanding by chance-37]: the structure of human sensory system determines that human beings are self-centered

GoLand 2021.1.1: configure the multi line display of the tab of the open file

NFT新的契机,多媒体NFT聚合平台OKALEIDO即将上线

Resource Cost Optimization Practice of R & D team
随机推荐
HALCON联合C#检测表面缺陷——HALCON例程autobahn
Mastering the cypress command line options is the basis for truly mastering cypress
Golang - command line tool Cobra
Kivy教程之 盒子布局 BoxLayout将子项排列在垂直或水平框中(教程含源码)
There is nothing new under the sun. Can the meta universe go higher?
Sequence table (implemented in C language)
This math book, which has been written by senior ml researchers for 7 years, is available in free electronic version
使用Tensorflow进行完整的深度神经网络CNN训练完成图片识别案例2
8 Queen question
编程内功之编程语言众多的原因
JS convert pseudo array to array
Unity Render Streaming通过Js与Unity自定义通讯
【BW16 应用篇】安信可BW16模组与开发板更新固件烧录说明
Universal dividend source code, supports the dividend of any B on the BSC
物联网毕设 --(STM32f407连接云平台检测数据)
AI 考高数得分 81,网友:AI 模型也免不了“内卷”!
Libuv库 - 设计概述(中文版)
Summary of common error reporting problems and positioning methods of thrift
Complete DNN deep neural network CNN training with tensorflow to complete image recognition cases
PhpMyAdmin stage file contains analysis traceability