QDialog - 对话框
QDialog - 对话框
一. 对话框
-
对话框是与用户进行简短交互的顶层窗口
-
QDialog是Qt中所有对话框
-
QDialog继承于QWidget是一种容器类组件
-
QDialog作为一种专用的交互窗口而存在
-
不能作为子部件嵌入其它容器中
-
是定制了窗口式样的特殊的QWidget
二. 对话框的特点
-
代码 - Widget作为Dialog的父组件时
#include "Dialog.h" #include <QApplication> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QDialog dl(&w); dl.setWindowTitle("Dialog"); dl.show(); w.setWindowTitle("Widget"); w.show(); return a.exec(); }
-
代码 - Dialog作为Widget的父组件时
#include "Dialog.h" #include <QApplication> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDialog dl; QWidget w(&dl); dl.setWindowTitle("Dialog"); dl.show(); w.setWindowTitle("Widget"); w.show(); return a.exec(); }
三. 对话框的类型
-
模态对话框
//显示后无法与父窗口进行交互 //是一种阻塞式的对话框调用方式 QDialog::exec();
如下图所示,Qt中的【选项】弹出的对话框就是一种模态对话框,这个对话框弹出来后,点击Qt的主窗口是无法点击的,只能关掉【选项】这个对话框才可以
-
非模态对话框
//显示后独立存在可以同时与父窗口进行交互 //是一种非阻塞式的对话框调用方式 QDialog::show();
非模态对话框我们看一下typora【更新】弹出来的这个对话框,弹出后,点击typora主页面不影响和主页面的交互,是一种非模态对话框
四. 实验
-
类的声明
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #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 "ui_Dialog.h" #include "Dialog.h" #include <QDebug> Dialog::Dialog(QWidget *parent) : QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this) { ModalBtn.setText("Modal Dialog"); ModalBtn.move(20, 20); ModalBtn.resize(200, 30); NormalBtn.setText("Normal Dialog"); NormalBtn.move(20, 70); NormalBtn.resize(200, 30); MixedBtn.setText("Mixed Dialog"); MixedBtn.move(20, 120); MixedBtn.resize(200, 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(240, 170); setFixedSize(width(), height()); } Dialog::~Dialog() { qDebug() << "~Dialog()"; }
-
模态对话框 - 在槽函数中实现
void Dialog::ModalBtn_Clicked() { qDebug() << "ModalBtn_Clicked() Begin"; QDialog dialog(this); //模态对话框 dialog.resize(300, 100); dialog.setWindowTitle("Modal Dialog"); dialog.exec(); //显示一个模态对话框,只有模态对话框才有返回值的概念,模态对话框的返回值用于表示交互结果 dialog.setFixedSize(width(), height()); // done(Accepted); qDebug() << "ModalBtn_Clicked() End"; }
-
非模态对话框
void Dialog::NormalBtn_Clicked() { qDebug() << "NormalBtn_Clicked() Begin"; #if 0 QDialog dialog(this); //非模态对话框在栈区开辟内存空间 dialog.resize(300, 100); dialog.setWindowTitle("Normal Dialog"); dialog.show(); //因为其没有阻塞的概念,会立即返回 #else QDialog* dialog = new QDialog(this); //非模态对话框没有阻塞的概念,要在堆区开辟内存空间 // QDialog* dialog = new Dialog(this); dialog->setWindowTitle("Normal Dialog"); dialog->resize(300, 100); dialog->setAttribute(Qt::WA_DeleteOnClose); //设置属性,防止内存泄漏 dialog->show(); // done(Rejected); #endif qDebug() << "NormalBtn_Clicked() End"; }
因为非模态对话框没有阻塞的概念,如果在栈区开辟内存空间,根据程序的运行会直接释放掉对话框,对话框只会显示一瞬
解决方法是,在堆区为非模态对话框申请空间,可以看到非模态对话框可以正常显示,并且没有阻塞其它窗口
-
混合类型的对话框 - 使用show()方法即非模态对话框,但是显示出来的属性特点是模态对话框
void Dialog::MixedBtn_Clicked() { qDebug() << "MixedBtn_Clicked() Begin"; QDialog* dialog = new QDialog(this); dialog->setWindowTitle("Mixed Dialog"); dialog->resize(300, 100); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->setModal(true); //设置非模态对话框,表现为模态对话框 dialog->show(); // done(100); qDebug() << "MixedBtn_Clicked() End"; }
-
main函数的内容
#include "Dialog.h" #include <QApplication> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog dl; dl.show(); return a.exec(); }