1、对话框的概念
1.1、 对话框是与用户进行简短交互的顶层窗口
1.2、 QDialog是Qt中所有对话框窗口的基类
1.3、 QDialog继承于QWidget是一种容器类型的组件
2、QDialog的意义
2.1、 QDialog作为一种专用的交互窗口而存在(而QWidget可以作为子组件嵌入到QDialogzhong)
2.2、 QDialog不能作为子部件嵌入到其它容器中
2.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);//父类组件管理子组件的生命周期,且准备将QDialog嵌入到QWidget中
w.show();
d.show();
*/
//将QWidget嵌套到QDialog中,显示一个窗口
QDialog d;
QWidget w(&d);//将QWidget嵌入到QDialog中,显示一个窗口,是可以的。
d.show();
w.show();
return a.exec();
}
3、对话框的类型
3.1、模态对话框(QDialog::exec())
3.1.1、 显示后无法与父窗口进行交互
3.1.2、 是一种堵塞式的对话框调用方式
3.2、 非模态对话框(QDialog::show())
3.2.1、 显示后独立存在,可以与父窗口进行交互
3.2.2、 是一种非堵塞式的调用方式
3.3、 一般情况下
3.3.1、 模态对话框用于必须依赖用户选择的场合(80%):消息提示、文本选择、打印设置等
3.3.2、 非模态对话框用于特殊功能设置的场合(20%):查找操作、属性设置等
3.4、 小技巧(父组件始终在布局的上方)
3.4.1、 在栈上创建模态对话框是最简单常用的方式
3.4.2、 一般情况下非模态对话框需要在堆上创建
3.4.3、 通过QDialog::setModal函数可以创建混合特性的对话框(就是具备模态的特性。类似模态对话框)
3.4.4、 非模态对话框需要指定Qt::WA_DeleteOnClose属性(因为是在堆上创建的)////这句设置就是告诉QT关闭窗口时,自动释放内存,调用析构函数。(最好再手动将这个指针置为NULL)
QDialog.h
#ifndef _QDIALOG_H_
#define _QDIALOG_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();
//~QDialog();
};
#endif // QDIALOG_H
QDialog.cpp
#include "QDialog.h"
#include <QDebug>
Dialog::Dialog(QWidget* parent) : QDialog(parent), ModalBtn(this), NorModalbtn(this), MixedBtn(this) //初始化列表
{
ModalBtn.setText(QString("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()));
this->resize(800, 800);
}
//这是模态对话框
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);//这句设置就是告诉QT关闭窗口时,自动释放内存。
normodal->show();
qDebug()<< "NorModalBtn_clicked() end";
}
void Dialog::MixedBtn_clicked()
{
qDebug()<< "MixedModalBtn_clicked() begin";
QDialog* mixedmodal = new QDialog(this);
mixedmodal->setAttribute(Qt::WA_DeleteOnClose);
//(就是具备模态的特性。类似模态对话框)
mixedmodal->setModal(true);//非0的数都是true, 设置混合模式的对话框。
mixedmodal->show();
qDebug()<< "MixedModalBtn_clicked() end";
}
Dialog::~Dialog()
{
qDebug() << "release?????";
}
main.cpp
#include <QtGui/QApplication>
#include "QDialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
4、对话框的返回值。
4.1、 只有模态对话框才有返回值的概念(阻塞式的)
4.2、 模态对话框的返回值用来表示交互结果
4.3、 QDialog::exec()的返回值为交互结果
4.3.1、 void QDialog::done(int i) 关闭对话框并将参数作为交互结果
4.3.2、 QDialog::Accepted 用户操作成功
4.3.3、 QDialog::Rejected 用户操作失败
QDialog.h
#ifndef _QDIALOG_H_
#define _QDIALOG_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();
//~QDialog();
};
#endif // QDIALOG_H
QDialog.cpp
#include "QDialog.h"
#include <QDebug>
Dialog::Dialog(QWidget* parent) : QDialog(parent), ModalBtn(this), NorModalbtn(this), MixedBtn(this) //初始化列表
{
ModalBtn.setText(QString("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()));
this->resize(800, 800);
}
//这是模态对话框
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()<< "MixedModalBtn_clicked() begin";
done(100);//返回这个值
qDebug()<< "MixedModalBtn_clicked() end";
}
Dialog::~Dialog()
{
qDebug() << "release?????";
}
main.cpp
#include <QtGui/QApplication>
#include "QDialog.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;//返回用户的选择。
}
5、小结
5.1、 对话框分为模态对话框和非模态对话框
5.2、 模态对话框是堵塞式的
5.3、 模态对话框用于依赖用户交互结果的场合
5.4、 非模态对话框是非堵塞式的
5.5、 非模态对话框用于功能设置的场合