对话框可以分为模式对话框和非模式对话框两种。模式对话框是指用户只能在当前的窗体中进行操作,在该窗体没有关闭之前不能切换到其它的窗体。非模式对话框是指当前的所操作的窗体可以切换。
简单来说,屏蔽同一应用程序中其它窗口事件响应的对话框,就叫做模式对话框。
一般情况下,用于确认信息的操作对话框属于模式对话框。如打开文件对话框就是典型的模式对话框,而常见的查找和替换便是非模式对话框。
在Qt中只要是继承至QDailog的窗口类都可以以模式对话框的方式来显示。
1 QDailog与QWidget对比
QWidget
1、指定父窗口的时候,不调用QWidget::show(),嵌套在父窗口中显示,与其它窗口共用消息循环。
2、指定父窗口的时候,调用QWidget::show(),仍然嵌套在父窗口中显示,与其它窗口共用消息循环。
3、不指定父窗口的时候,调用QWidget::show(),以顶级窗口方式显示,与其它窗口共用消息循环。
4、不能以模态窗口方式显示,没有exe()函数。
QDailog继承至QWidget
1、指定父窗口的时候,不调用QWidget::show(),不显示窗口。
2、指定父窗口的时候,调用QWidget::show(),以顶级窗口方式显示,与其它窗口共用消息循环。
3、不指定父窗口的时候,调用QWidget::show(),以顶级窗口方式显示,与其它窗口共用消息循环。
4、模态窗口显示,,调用QDailog::exec(),屏蔽其它窗口消息循环。
注意:简单来看,如果想以模式窗口显示,继承QDailog,调用QDailog::exec()即可。
2 触发一个模式对话框
例如:
Widget::Widget(QWidget *parent) : QWidget(parent)
{
QPushButton * pb = new QPushButton("dialog", this);
connect(pb, SIGNAL(clicked()), this, SLOT(showDialog));
}
void Widget::showDialog()
{
QDialog dialog;
dialog.exec(); // 消息循环,阻塞等待模式窗口关闭。
}
3 模式窗口exec返回值
[virtual slot] int QDialog::exec()
这个函数是模式窗口的关键,它会屏蔽原先的QApplication::exec的消息循环接收消息,所有的消息都被它接收走,直到它返回,其返回值为1时代表QDialog::Accepted,为0时代表QDialog::Rejected。
如果想返回QDialog::Accepted,那么只需调用一下QDialog::accept槽函数
[virtual slot] void QDialog::accept()
如果想返回QDialog::Rejected,那么只需调用一下QDialog::reject槽函数
[virtual slot] void QDialog::reject()
如果想返回其它自定义的值,那么只需要调用一下QDialog::done槽函数
[virtual slot] void QDialog::done(int r) //r参数来指定exec的返回值
来看一个复杂一点的例子:
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
initMainWidget();
initDialog();
}
void Widget::initMainWidget()
{
QHBoxLayout * hBox = new QHBoxLayout(this);
QPushButton * pb = new QPushButton("pb", this);
hBox->addWidget(pb);
this->setLayout(hBox);
connect(