1、对话框的概念
1.1、
对话框是与用户进行
简短交互
的
顶层窗口
1.2、
QDialog
是Qt中
所有对话框窗口的基类
1.3、
QDialog
继承于QWidget
是一种
容器类型的组件
2、QDialog的意义
2.1、
QDialog作为一种
专用的交互窗口
而存在(而QWidget可以作为子组件嵌入到QDialogzhong)
2.2、
QDialo
g不能
作为子部件
嵌入
到其它容器中
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、
非模态
对话框用于
功能设置
的场合