标签:
1. 对话框的概念
(1)概念
①对话框是与用户进行简短交互的顶层窗口
②QDialog是Qt中所有对话框窗口的基类
③QDialog继承于QWidget是一种容器类型的组件
(2)QDialog的意义
①QDialog作为一种专用的交互窗口而存在
②QDialog不能作为子部件嵌入其它容器中
③QDialog是定制了窗口式样的特殊的QWidget
【编程实验】QDialog和QWidget的区别
#include <QApplication> #include <QWidget> #include <QDialog> int main(int argc, char *argv[]) { QApplication a(argc, argv); //实验1:将dialog作为widget的子对象,但不能被嵌入widget QWidget *widget = new QWidget(); QDialog dialog(widget); //这里虽然将widget作为dialog的父组件,但 //dialog并不会被嵌入widget中, //以下代码会显示出两个顶层窗口,而不是只有一个! dialog.show(); dialog.setWindowTitle("I‘m dialog"); widget->show(); widget->setWindowTitle("I‘m widget"); // //实验2:将widget作为dialog的子对象,这是合法的 // QDialog dialog; // QWidget *widget = new QWidget(&dialog); // //以下代码会显示出两个顶层窗口,而不是只有一个! // dialog.show(); // dialog.setWindowTitle("I‘m dialog"); // widget->show(); // widget->setWindowTitle("I‘m widget"); return a.exec(); }
2.对话框的类型
(1)模态对话框(QDialog::exec())
①显示后无法与父窗口进行交互
②是一种阻塞式的对话框调用方式
③一般情况下,模态对话框用于必须依赖用户选择的场合(80%)。如消息提示、文件选择、打印设置等。
(2)非模态对话框(QDialog::show())
①显示后独立存在,可以同时与父窗口进行交互
②是一种非阻塞式的对话框调用方式
③用于特殊功能设置的场合(20%)。如查找操作、属性设置等。
▲小技巧
①在栈上创建模态对话框是最简单常用的方式
②一般情况下非模态对话框需要在堆上创建
③通过QDialog::setModal函数可以创建混合特性的对话框。
④非模态对话框需要指定Qt::WA_DeleteOnClose属性。即关闭时删除以避免内存泄漏。
【编程实验】不同特性的对话框
//main.cpp
#include <QApplication> #include "Dialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog dlg; //模态对话框一般在栈上创建对象,非模态在堆上 dlg.exec();//模态显示 return 0; }
//Dialog.h
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <QPushButton> class Dialog: public QDialog { Q_OBJECT protected: QPushButton ModalBtn; QPushButton NormalBtn; QPushButton MixedBtn; QPushButton AcceptBtn; QPushButton RejectBtn; protected slots: void ModalBtn_Clicked(); void NormalBtn_Clicked(); void MixedBtn_Clicked(); void AcceptBtn_Clicked(); void RejectBtn_Clicked(); public: Dialog(QWidget* parent = 0); ~Dialog(); }; #endif // DIALOG_H
//Dialog.cpp
#include <QDebug> #include "Dialog.h" Dialog::Dialog(QWidget* parent): QDialog(parent), ModalBtn(this),NormalBtn(this),MixedBtn(this), AcceptBtn(this),RejectBtn(this) { ModalBtn.setText("Modal Dialog"); ModalBtn.move(20, 20); ModalBtn.resize(150, 30); NormalBtn.setText("Normal Dialog"); NormalBtn.move(20, 70); NormalBtn.resize(150, 30); MixedBtn.setText("Mixed Dialog"); MixedBtn.move(20, 120); MixedBtn.resize(150, 30); AcceptBtn.setText("Accept"); AcceptBtn.move(20,170); AcceptBtn.resize(70,30); RejectBtn.setText("Reject"); RejectBtn.move(100,170); RejectBtn.resize(70,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())); connect(&AcceptBtn, SIGNAL(clicked()), this, SLOT(AcceptBtn_Clicked())); connect(&RejectBtn, SIGNAL(clicked()), this, SLOT(RejectBtn_Clicked())); resize(190, 220); } void Dialog::ModalBtn_Clicked() { qDebug() << "ModalBtn_Clicked()...Begin"; QDialog dlg(this); dlg.setWindowTitle("I‘m a Modal Dialog"); dlg.exec(); //模态 qDebug() << "ModalBtn_Clicked()...End"; } void Dialog::NormalBtn_Clicked() { qDebug() << "NormalBtn_Clicked()...Begin"; QDialog* dlg = new QDialog(this);//非模态,在堆上创建 dlg->setWindowTitle("I‘m a Normal Dialog"); dlg->setAttribute(Qt::WA_DeleteOnClose); //当窗体关闭时被删除,同时将自己从 //父对象链表中移除,所以dlg不会被 //析构两次! dlg->show(); //非模态 qDebug() << "NormalBtn_Clicked()...End"; } void Dialog::MixedBtn_Clicked() { qDebug() << "MixedBtn_Clicked()...Begin"; //混合特性的对话框,要在堆上创建对象 QDialog* dlg = new QDialog(this); dlg->setWindowTitle("I‘m a Mixed Dialog"); dlg->setAttribute(Qt::WA_DeleteOnClose); //当窗体关闭时被删除,同时将自己从 //父对象链表中移除,所以dlg不会被 //析构两次! dlg->setModal(true);//设置为模态的 dlg->show(); //虽然此处调用的是show,但仍以模态方式显示 qDebug() << "MixedBtn_Clicked()...End"; } void Dialog::AcceptBtn_Clicked() { done(Accepted);//结束对话框,并返回Accepted } void Dialog::RejectBtn_Clicked() { done(Rejected);//结束对话框,并返回Rejected } Dialog::~Dialog() { qDebug() << "~Dialog()"; }
3. 对话框的返回值
(1)只有模态对话框才有返回值的概念
(2)模态对话框的返回值用于表示交互结果
(3)QDialog::exec()的返回值为交互结果。
①void QDialog::done(int):调用该函数,用来关闭对话框,并将参数作为交互结果。
②QDialog::Accepted:用户操作成功
③QDialog::Rejected:用户操作失败
【编程实验】对话框的返回值
//main.cpp
#include <QApplication> #include <QDialog> #include <QDebug> #include "Dialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog dlg; //模态对话框一般在栈上创建对象,非模态在堆上 int r = dlg.exec();//模态显示 if(r == QDialog::Accepted) //测试对话框的返回值 { qDebug() << "Accepted"; }else if(r == QDialog::Rejected) { qDebug() << "Rejected"; } else { qDebug() << r; } return r; }
//Dialog.h和Dialog.cpp文件与前一个例子相同
4. 小结
(1)对话框分为模态对话框和非模态对话框
(2)模态对话框是阻塞式的
(3)模态对话框用户依赖用户交互结果的场合
(4)非模态对话框是非阻塞式的
(5)非模态对话框用于功能设置的场合
标签:
原文地址:http://www.cnblogs.com/5iedu/p/5450182.html