当前位置:网站首页>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中的头文件。
小结
- 对话框分为模态对话框和非模态对话框
- 模态对话框是阻塞式的
- 模态对话框用于以来用户交互结果的场合
- 非模态对话框是非阻塞式的
- 非模态对话框用于功能设置的场合
边栏推荐
- RichView TRVStyle ListStyle 列表样式(项目符号编号)
- 使用vscode查看Hex或UTF-8编码
- Unity EmbeddedBrowser浏览器插件事件通讯
- Record 405 questions about bank callback post request
- Golang — 命令行工具cobra
- JS 将伪数组转换成数组
- [développement technologique - 24]: caractéristiques des technologies de communication Internet des objets existantes
- The principle of human voice transformer
- Go language unit test 3: go language uses gocovey library to do unit test
- Multi table query of MySQL - multi table relationship and related exercises
猜你喜欢
Complete DNN deep neural network CNN training with tensorflow to complete image recognition cases
Halcon combined with C # to detect surface defects -- Halcon routine autobahn
Resource Cost Optimization Practice of R & D team
研发团队资源成本优化实践
常见的几种最优化方法Matlab原理和深度分析
Unity embeddedbrowser browser plug-in event communication
Unity EmbeddedBrowser浏览器插件事件通讯
NFT new opportunity, multimedia NFT aggregation platform okaleido will be launched soon
Bidirectional linked list (we only need to pay attention to insert and delete functions)
[技術發展-24]:現有物聯網通信技術特點
随机推荐
AI 考高数得分 81,网友:AI 模型也免不了“内卷”!
[how to earn a million passive income]
HALCON联合C#检测表面缺陷——HALCON例程autobahn
MySQL functions and related cases and exercises
使用tensorflow进行完整的DNN深度神经网络CNN训练完成图片识别案例
Mycms we media mall v3.4.1 release, user manual update
Swiftui development experience: the five most powerful principles that a programmer needs to master
Leetcode-1175. Prime Arrangements
Bidirectional linked list (we only need to pay attention to insert and delete functions)
Error running 'application' in idea running: the solution of command line is too long
Father and basketball
The network card fails to start after the cold migration of the server hard disk
Shell timing script, starting from 0, CSV format data is regularly imported into PostgreSQL database shell script example
掌握Cypress命令行选项,是真正掌握Cypress的基础
This math book, which has been written by senior ml researchers for 7 years, is available in free electronic version
Unity EmbeddedBrowser浏览器插件事件通讯
全面发展数字经济主航道 和数集团积极推动UTONMOS数藏市场
Leetcode-1175.Prime Arrangements
Which securities company has the lowest Commission for opening an account online? I want to open an account. Is it safe for the online account manager to open an account
【被动收入如何挣个一百万】