当前位置:网站首页>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中的头文件。
小结
- 对话框分为模态对话框和非模态对话框
- 模态对话框是阻塞式的
- 模态对话框用于以来用户交互结果的场合
- 非模态对话框是非阻塞式的
- 非模态对话框用于功能设置的场合
边栏推荐
- Unity embeddedbrowser browser plug-in event communication
- SQL Injection (POST/Search)
- Red hat satellite 6: better management of servers and clouds
- [bw16 application] instructions for firmware burning of Anxin Ke bw16 module and development board update
- 8 Queen question
- Asp. Net core1.1 without project JSON, so as to generate cross platform packages
- Comprehensive evaluation of double chain notes remnote: fast input, PDF reading, interval repetition / memory
- JSON serialization case summary
- 全面发展数字经济主航道 和数集团积极推动UTONMOS数藏市场
- Open PHP error prompt under Ubuntu 14.04
猜你喜欢
[understanding by chance-37]: the structure of human sensory system determines that human beings are self-centered
Golang — 命令行工具cobra
Golang - command line tool Cobra
Use and design of Muduo buffer class
AI 考高数得分 81,网友:AI 模型也免不了“内卷”!
User and group command exercises
[quantitative trading] permanent portfolio, turtle trading rules reading, back testing and discussion
Flutter dynamic | fair 2.5.0 new version features
常见的几种最优化方法Matlab原理和深度分析
The solution of Chinese font garbled code in keil5
随机推荐
Internet of things completion -- (stm32f407 connects to cloud platform detection data)
Flutter dynamic | fair 2.5.0 new version features
【电脑插入U盘或者内存卡显示无法格式化FAT32如何解决】
如何使用lxml判断网站公告是否更新
untiy世界边缘的物体阴影闪动,靠近远点的物体阴影正常
3D视觉——2.人体姿态估计(Pose Estimation)入门——OpenPose含安装、编译、使用(单帧、实时视频)
Summary of common error reporting problems and positioning methods of thrift
[sort] bucket sort
Go language web development series 29: Gin framework uses gin contrib / sessions library to manage sessions (based on cookies)
IBEM 数学公式检测数据集
Field problems in MySQL
AI 考高数得分 81,网友:AI 模型也免不了“内卷”!
Go 1.16.4: purpose of go mod tidy
Halcon combined with C # to detect surface defects -- Halcon routine autobahn
NFT new opportunity, multimedia NFT aggregation platform okaleido will be launched soon
JVM系列——概述,程序计数器day1-1
Dynamic programming 01 knapsack and complete knapsack
Swiftui development experience: the five most powerful principles that a programmer needs to master
8 Queen question
Leetcode-1175.Prime Arrangements