Qt深入浅出(八)模态对话框

模式对话框

​ 对话框可以分为模式对话框和非模式对话框两种。模式对话框是指用户只能在当前的窗体中进行操作,在该窗体没有关闭之前不能切换到其它的窗体。非模式对话框是指当前的所操作的窗体可以切换。

​ 简单来说,屏蔽同一应用程序中其它窗口事件响应的对话框,就叫做模式对话框。

​ 一般情况下,用于确认信息的操作对话框属于模式对话框。如打开文件对话框就是典型的模式对话框,而常见的查找和替换便是非模式对话框。

​ 在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 触发一个模式对话框

​ 例如:


#include "widget.h"
#include <QPushButton>
#include <QDialog>
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的返回值

来看一个复杂一点的例子:


#include "widget.h"
#include <QPushButton>
#include <QHBoxLayout>
#include <QDialog>
#include <QDebug>


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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值