一、对话框的概念
1、对话框是与用户进行简短交互的顶层窗口
2、QDialog是Qt中所有对话框窗口的基类
3、QDialog继承于QWidget是一种容器类型的组件
二、QDialog的意义
1、QDialog作为一种专用的交互窗口而存在
2、QDialog不能作为子部件嵌入到其它容器中
3、QDialog是定制了窗口式样的特殊QWidget
View Code
#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属性
Dialog.h
#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
Dialog.h
QDialog.cpp
#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()
{
}
QDialog.cpp
main.cpp
#include <QtGui/QApplication>
#include "Dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
main.cpp
三、对话框的返回值
1、只有模态对话框才有返回值的概念
2、模态对话框的返回值用来表示交互结果
3、QDialog::exec()的返回值为交互结果
(1)、void QDialog::done(int i) 关闭对话框并将参数作为交互结果
(2)、QDialog::Accepted 用户操作成功
(3)、QDialog::Rejected 用户操作失败
Dialog.h
#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
Dialog.h
Dialog.cpp
#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()
{
}
Dialog.cpp
main.cpp
#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;
}
main.cpp
四、小结
(1)、对话框分为模态对话框和非模态对话框
(2)、模态对话框是堵塞式的
(3)、模态对话框用于依赖用户交互结果的场合
(4)、非模态对话框是非堵塞式的
(5)、非模态对话框用于功能设置的场合