一、对话框的概念
1、对话框是与用户进行简短交互的顶层窗口
2、QDialog是Qt中所有对话框窗口的基类
3、QDialog继承于QWidget是一种容器类型的组件
二、QDialog的意义
1、QDialog作为一种专用的交互窗口而存在
2、QDialog不能作为子部件嵌入到其它容器中
3、QDialog是定制了窗口式样的特殊QWidget
#include <QtGui/QApplication> #include <QWidget> #include <QDialog> int main(int argc, char *argv[]) { QApplication a(argc, argv); /*显示两个窗口,QDialog不会嵌套到QWidget中,且QDialog在顶层 QWidget w; QDialog d(&w); w.show(); d.show(); */ //QWidget嵌套到QDialog中,显示一个窗口 QDialog d; QWidget w(&d); d.show(); w.show(); return a.exec(); }
三、对话框的类型
1、模态对话框(QDialog::exec())
(1)、显示后无法与父窗口进行交互
(2)、是一种堵塞式的对话框调用方式
2、非模态对话框(QDialog::show())
(1)、显示后独立存在,可以与父窗口进行j交互
(2)、是一种非堵塞式的调用方式
3、一般情况下
(1)、模态对话框用于必须依赖用户选择的场合(80%):消息提示、文本选择、打印设置等
(2)、非模态对话框用于特殊功能设置的场合(20%):查找操作、属性设置等
4、小技巧
(1)、在栈上创建模态对话框是最简单常用的方式
(2)、一般情况下非模态对话框需要在堆上创建
(3)、通过QDialog::setModal函数可以创建混合特性的对话框
(4)、非模态对话框需要指定Qt::WA_DeleteOnClose属性
#ifndef DIALOG_H #define DIALOG_H #include <QtGui/QDialog> #include <QPushButton> class Dialog : public QDialog { Q_OBJECT protected: QPushButton ModalBtn; QPushButton NorModalBtn; QPushButton MixedBtn; protected slots: void ModalBtn_clicked(); void NorModalBtn_clicked(); void MixedBtn_clicked(); public: Dialog(QWidget *parent = 0); ~Dialog(); }; #endif // DIALOG_H
#include "Dialog.h" #include <QDebug> Dialog::Dialog(QWidget *parent) : QDialog(parent), ModalBtn(this), NorModalBtn(this), MixedBtn(this) { ModalBtn.setText("ModalBtn"); ModalBtn.move(35, 20); ModalBtn.resize(100,30); NorModalBtn.setText("NorModalBtn"); NorModalBtn.move(35, 60); NorModalBtn.resize(100,30); MixedBtn.setText("MixedBtn"); MixedBtn.move(35, 100); MixedBtn.resize(100,30); connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_clicked()));//关联信号与槽 connect(&NorModalBtn, SIGNAL(clicked()), this, SLOT(NorModalBtn_clicked())); connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_clicked())); resize(170,170); } void Dialog::ModalBtn_clicked() { qDebug() << "ModalBtn_clicked begin"; QDialog modal(this);//在栈中生成 modal.exec();//调用exec()函数成为模态对话框,堵塞式 qDebug() << "ModalBtn_clicked end"; } void Dialog::NorModalBtn_clicked() { qDebug() << "NorModalBtn_clicked begin"; QDialog* normodal = new QDialog(this);//在堆中分配,指定父窗口后就会始终在父窗口顶层 normodal->setAttribute(Qt::WA_DeleteOnClose); normodal->show();//非模态对话框是非堵塞式,成为非模态对话框后立即向下执行,所以要在堆中生成 qDebug() << "NorModalBtn_clicked end"; } void Dialog::MixedBtn_clicked() { qDebug() << "MixedBtn_clicked begin"; QDialog* mixedbtn = new QDialog(this); mixedbtn->setAttribute(Qt::WA_DeleteOnClose); mixedbtn->setModal(true);//设置混合对话框,注意参数是bool类型 mixedbtn->show(); qDebug() << "MixedBtn_clicked end"; } Dialog::~Dialog() { }
#include <QtGui/QApplication> #include "Dialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); }
三、对话框的返回值
1、只有模态对话框才有返回值的概念
2、模态对话框的返回值用来表示交互结果
3、QDialog::exec()的返回值为交互结果
(1)、void QDialog::done(int i) 关闭对话框并将参数作为交互结果
(2)、QDialog::Accepted 用户操作成功
(3)、QDialog::Rejected 用户操作失败
#ifndef DIALOG_H #define DIALOG_H #include <QtGui/QDialog> #include <QPushButton> class Dialog : public QDialog { Q_OBJECT protected: QPushButton ModalBtn; QPushButton NorModalBtn; QPushButton MixedBtn; protected slots: void ModalBtn_clicked(); void NorModalBtn_clicked(); void MixedBtn_clicked(); public: Dialog(QWidget *parent = 0); ~Dialog(); }; #endif // DIALOG_H
#include "Dialog.h" #include <QDebug> Dialog::Dialog(QWidget *parent) : QDialog(parent), ModalBtn(this), NorModalBtn(this), MixedBtn(this) { ModalBtn.setText("ModalBtn"); ModalBtn.move(35, 20); ModalBtn.resize(100,30); NorModalBtn.setText("NorModalBtn"); NorModalBtn.move(35, 60); NorModalBtn.resize(100,30); MixedBtn.setText("MixedBtn"); MixedBtn.move(35, 100); MixedBtn.resize(100,30); connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_clicked()));//关联信号与槽 connect(&NorModalBtn, SIGNAL(clicked()), this, SLOT(NorModalBtn_clicked())); connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_clicked())); resize(170,170); } void Dialog::ModalBtn_clicked() { qDebug() << "ModalBtn_clicked begin"; done(Accepted); qDebug() << "ModalBtn_clicked end"; } void Dialog::NorModalBtn_clicked() { qDebug() << "NorModalBtn_clicked begin"; done(Rejected); qDebug() << "NorModalBtn_clicked end"; } void Dialog::MixedBtn_clicked() { qDebug() << "MixedBtn_clicked begin"; done(100); qDebug() << "MixedBtn_clicked end"; } Dialog::~Dialog() { }
#include <QtGui/QApplication> #include "Dialog.h" #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; int r = w.exec();//这里已经是进入消息循环,所以返回值那里不再用a.exec() if(r==QDialog::Accepted) { qDebug() << "Accepted"; } else if(r == QDialog::Rejected) { qDebug() << "Rejected"; } else { qDebug() << r; } return r; }
四、小结
(1)、对话框分为模态对话框和非模态对话框
(2)、模态对话框是堵塞式的
(3)、模态对话框用于依赖用户交互结果的场合
(4)、非模态对话框是非堵塞式的
(5)、非模态对话框用于功能设置的场合