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

简述

关于模式和非模式,相信大家都比较熟悉,但其中有一个可能很多人都比较陌生,介于两者之间的状态,称之为“半模式“。

下面以实际应用为例来介绍一下这几种状态。

  • 简述
  • 模式对话框
    • 描述
    • 效果
    • 源码
  • 非模式对话框
    • 描述
    • 效果
    • 源码
  • 半模式对话框
    • 描述
    • 效果
    • 源码
  • 更多参考

模式对话框

描述

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

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

效果

源码

MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();

CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("模式对话框"));

// 关键代码
pDialog->exec();

// 关闭模态对话框以后才会执行下面的代码
pMainWindow->setWindowTitle(QStringLiteral("主界面-模式对话框"));
qDebug() << QStringLiteral("关闭模态对话框以后,可以继续向下执行");
  1. 主界面被阻塞,不能进行点击、拖动等任何操作。
  2. exec()之后的代码不会执行,直到关闭模态对话框。

非模式对话框

描述

和同一个程序中其它窗口操作无关的对话框。在文字处理中的查找和替换对话框通常是非模式的,允许用户同时与应用程序的主窗口和对话框进行交互。调用show()来显示非模式对话框,并立即将控制返回给调用者。

如果隐藏对话框后调用show()函数,对话框将显示在其原始位置,这是因为窗口管理器决定的窗户位置没有明确由程序员指定,为了保持被用户移动的对话框位置,在closeEvent()中进行处理,然后在显示之前,将对话框移动到该位置。

效果

源码

MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();

CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("非模式对话框"));

// 关键代码
pDialog->show();

// 下面的代码会立即运行
pMainWindow->setWindowTitle(QStringLiteral("主界面-非模式对话框"));
qDebug() << QStringLiteral("立即运行");
  1. 主界面不会被阻塞,可以进行点击、拖动等任何操作。
  2. show()之后的代码会立即执行。

“半模式”对话框

描述

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

对于进度对话框来说,调用setModal(true)是非常有用的,用户必须拥有与其交互的能力,例如:取消长时间运行的操作。如果使用show()和setModal(true)共同执行一个长时间操作,则必须定期在执行过程中调用QApplication ::processEvents(),以使用户能够与对话框交互(可以参考QProgressDialog)。

效果

源码

MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();

CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("半模式对话框"));

// 关键代码
pDialog->setModal(true);
pDialog->show();

// 下面的代码会立即运行
pMainWindow->setWindowTitle(QStringLiteral("主界面-半模式对话框"));
qDebug() << QStringLiteral("立即运行");
  1. 主界面被阻塞,不能进行点击、拖动等任何操作。
  2. show()之后的代码会立即执行。

更多参考

时间: 2024-08-02 23:08:11

Qt之模式、非模式、&quot;半模式&quot;对话框的相关文章

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

简述 关于"模式"和"非模式"对话框,相信大家都比较熟悉,但其中有一个可能很多人都比较陌生,介于两者之间的状态,我们称之为"半模式". 简述 模式对话框 描述 效果 源码 非模式对话框 描述 效果 源码 半模式对话框 描述 效果 源码 更多参考 模式对话框 描述 阻塞同一应用程序中其它可视窗口输入的对话框.模式对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口.模式对话框仅阻止访问与对话相

Qt之线程同步(生产者消费者模式 - QWaitCondition)

简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Wait condition(等待条件)比单独使用 mutex(互斥量)有一个更高级的并发性,如果缓冲区的访问由一个 QMutex 把守,当生产者线程访问缓冲区时,消费者线程将无法访问.然而,两个线程同时访问不同的缓冲区是没有害处的. 示例包含两个类:Producer 和 Consumer,均继承自 QThread.循环缓冲区用于两个类之间的沟通,同步工具用于保

Qt之线程同步(生产者消费者模式 - QSemaphore)

简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,此时,它将从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Semaphore(信号量) 比 mutex(互斥量)有一个更高级的并发性.如果缓冲区的访问由一个 QMutex 把守,当生产者线程访问缓冲区时,消费者线程将无法访问.然而,有两个线程同一时间访问不同的缓冲区是没有害处的. 示例包括两个类:Producer 和 Consumer,均继承自 QThread.循环缓冲区用于这两个类之间的沟通,信号量用于保护全局变量

商业模式新生代之免费商业模式

   这次商业模式学习比较简单,可能于实际市场还有脱节,有些例子也不是很新.    但是商业模式贵在活学活用,这次下定决心今年利用周末时间,要把<商业模式新生代>全部看完.(宏.微观经济学还是靠后吧)    非科班出生,只能做做笔记,写写心得,希望以后每看到一个商业现象,就能想到是哪中商业模式大类.    这本书主要涵盖: .非绑定式商业模式 .长尾式商业模式 .多边平台式商业模式 .免费商业模式 .开放式商业模式     另外,还有设计.战略.流程....     呵呵,比较假大空,即使学会

Java模式开发之责任链模式

从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 假比说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图).当鼓声停止时,手中有花的人就得执行酒令. 开发之责任链

创建型模式--抽象工厂模式

工厂三兄弟之抽象工厂模式(一) 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中 存在大量的工厂类,势必会增加系统的开销.此时,我们可以考虑将一些相关的产品组成一个"产品族",由同一个工厂来统一生产,这就是我们本文将要学习的抽 象工厂模式的基本思想. 界面皮肤库的初始设计 Sunny 软件公司欲开发一套界面皮肤库,可以对 Java 桌面软件进行界面美化.为了保护版权,该皮肤库源代码不打算公开,而只

创建型模式中关于工厂的模式

   在创建型模式中,有3中关于工厂的模式,分别是:简单工厂模式,工厂方法模式,抽象工厂模式.这3中模式既有各自的优点,同时,这3中模式又可以逐步演化:如,简单工厂可以演化成工厂方法,工厂方法可以演化成抽象工厂.   简单工厂到工厂方法      由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中:它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了.     另外,当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同

解决编译内核模块helloworld.c:1: 错误:代码模式‘kernel’在 32 位模式下不受支持问题,未编译对64位的支持

Makefile内容: KERNELDIR ?=/root/Desktop/work/TI/linux-3.2.0 PWD := $(shell pwd) obj-m += helloworld.o default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: @rm -f *.o *.ord* *.sy* *.mod.* *.ko clean标记中的@表示,执行命令的时候,终端上面不打印rm -r xxx.xx make出错信息: [root

安卓百度地图导航的模式怎么设置?夜间模式还有白天模式 求代码

问题描述 安卓百度地图导航的模式怎么设置?夜间模式还有白天模式 求代码 安卓百度地图导航的模式怎么设置?夜间模式还有白天模式 求代码? 解决方案 UiModeManager设置夜间模式和行车模式