0
点赞
收藏
分享

微信扫一扫

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

模式对话框

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

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

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

13 Qt 之模式、非模式、半模式对话框_实例代码

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

但是我们不能点击除了模式对话框以外的对话框,包括主界面,(当然可以点击其他程序的对话框,如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();
}

运行结果:

13 Qt 之模式、非模式、半模式对话框_#include_02

非模式对话框

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

13 Qt 之模式、非模式、半模式对话框_实例代码_03

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

实例代码:

#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();
}

 

13 Qt 之模式、非模式、半模式对话框_实例代码_04

半模式

调用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();
}

 

 

举报

相关推荐

0 条评论