13 Qt 之模式、非模式、半模式对话框

本文深入探讨了模式对话框、非模式对话框及半模式对话框的概念与应用。详细介绍了模式对话框如何阻断用户与其他窗口的交互,直至对话框关闭;非模式对话框则允许用户在对话框和主窗口间自由切换;而半模式对话框则介于两者之间,限制了主窗口的访问但不完全阻断。通过实例代码展示了不同对话框的实现方式。

模式对话框


描述
阻塞同一应用程序中其它可视窗口输入的对话框。模式对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框仅阻止访问与对话相关联的窗口,允许用户继续使用其它窗口中的应用程序。

显示模态对话框最常见的方法是调用其exec()函数,当用户关闭对话框,exec()将提供一个有用的返回值,并且这时流程控制继续从调用exec()的地方进行。通常情况下,要获得对话框关闭并返回相应的值,我们连接默认按钮,例如:”确定”按钮连接到accept()槽,”取消”按钮连接到reject()槽。另外我们也可以连接done()槽,传递给它Accepted或Rejected。

如当我们用QtCreator打开一个项目或文件时,会出现以下画面

我们可以正常点击模式对话框里的内容,并且可以放大和缩小对话框。

但是我们不能点击除了模式对话框以外的对话框,包括主界面,(当然可以点击其他程序的对话框,如QQ)

只有当我点击  打开   或   取消    后才能退出模式对话框,只有模式对话框退出后程序才能继续运行

以下的代码都以mainwindow为主基类

实例代码:主函数

#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
#include <QtDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle(QObject::tr("主界面"));
    w.show();
    QDialog *dlg=new QDialog(&w);
    dlg->setWindowTitle(QObject::tr("模式对话框"));
    dlg->exec();
    qDebug()<<"退出模式对话框"<<endl;
    w.setWindowTitle(QObject::tr("主界面模式对话框"));
    return a.exec();
}

运行结果:

非模式对话框


描述
和同一个程序中其它窗口操作无关的对话框。在文字处理中的查找和替换对话框通常是非模式的,允许用户同时与应用程序的主窗口和对话框进行交互。调用show()来显示非模式对话框,并立即将控制返回给调用者。
如果隐藏对话框后调用show()函数,对话框将显示在其原始位置,这是因为窗口管理器决定的窗户位置没有明确由程序员指定,为了保持被用户移动的对话框位置,在closeEvent()中进行处理,然后在显示之前,将对话框移动到该位置。

我们不仅可以点击非模式对话框,还可以点击主界面

实例代码:

#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
#include <QtDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle(QObject::tr("主界面"));
    w.show();
    QDialog *dlg=new QDialog(&w);
    dlg->setWindowTitle(QObject::tr("非模式对话框"));
    dlg->show();
    w.setWindowTitle(QObject::tr("主界面非模式对话框"));
    qDebug() << QStringLiteral("非模式对话框可立即执行");
    return a.exec();
}

 

半模式

调用setModal(true)或者setWindowModality(),然后show()。有别于exec(),show() 立即返回给控制调用者。

对于进度对话框来说,调用setModal(true)是非常有用的,用户必须拥有与其交互的能力,例如:取消长时间运行的操作。

也就是说,半模式介于模式和非模式之间,程序可以再打开半模式对话框后继续运行,但是不能点击主界面

实例代码:

#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
#include <QtDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle(QObject::tr("主界面"));
    w.show();
    QDialog *dlg=new QDialog(&w);
    dlg->setWindowTitle(QObject::tr("半模式对话框"));
    dlg->setModal(true);
    dlg->show();
    w.setWindowTitle(QObject::tr("主界面半模式对话框"));
    qDebug() << QStringLiteral("半模式对话可立即执行");
    return a.exec();
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值