对话框是GUI程序和用户进行简短交互的顶层窗口,所谓顶层窗口即始终在主窗口之上显示。QDialog是Qt所有类型的对话框窗口的基类,它继承于QWidget,是一种容器类型组件。
QWidget是所有窗口类的抽象,它也可以生成对话框,但是对话框是常见的窗口组件,若每次要使用对话框,都利用QWidget来生成并设置相关参数,显然十分繁琐。所以Qt为我们封装了另外一个子类QDialog,专门用于生成对话框。
1. 模态和非模态对话框
对话框归为两大类,即模态对话框于非模态对话框。
模态对话框(QDialog::exec())
阻塞型的对话框,显示后无法与父窗口进行交互。如word文档中修改源文件内容后直接关闭窗口弹出的对话框:
非模态对话框(QDialog::show())
非阻塞型的对话框,显示后还可以与父窗口进行交互。如word文档的替换操作:
模态对话框:
(1) 定义一个主窗口,窗口内有一个按钮:
//Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QDebug>
class Widget : public QWidget
{
Q_OBJECT //表要类要使用信号与槽机制
protected:
QPushButton Btn; //按钮
protected slots:
void Btn_Clicked(); //槽,用于响应按钮按下操作
public:
Widget(QWidget *parent = 0); //parent默认参数为0,表默认是容器类父窗口
~Widget();
};
#endif // WIDGET_H
//Widget.cpp
#include "Widget.h"
#include "Dialog.h"
//Widget的构造函数,Btn初始化为其Widget的功能类字子组件
Widget::Widget(QWidget *parent) : QWidget(parent), Btn(this)
{
Btn.resize(80, 30);
Btn.move(40, 40);
Btn.setText("btn");
resize(240, 100);
setWindowTitle("hello");
connect(&Btn, SIGNAL(clicked()), this, SLOT(Btn_Clicked()));
}
Widget::~Widget()
{
}
//Widget内按钮的响应槽,该按钮按下后Winget会弹出对话框(Dialog)
void Widget::Btn_Clicked()
{
qDebug() << "Btn_Clicked()";
Dialog d(this); //Dialog是对话框类,见下
int ret = d.exec(); //exec()表明d是个模态对话框,用户不操作该对话框,会阻塞于此。
//exec()返回对话框的运行结果
if (ret == Dialog::Accepted)
{
qDebug() << "Accepted";
}
else if (ret == Dialog::Rejected)
{
qDebug() << "Rejected";
}
}