PyQt5对话框QDialog
1. 对话框和窗口
QDialog的继承关系如下图所示:
QDialog类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。
以下是对话框和窗口的一些基础概念:
1、 QDialog 继承自 QWidget,那么 QDialog 就应遵守 QWidget 的基本规则, QWidget 是描述Qt 部件的基础类,该类对部件的类型进行了描述和规定,对话框需要遵循这些规则。
2、 窗口标志:用于指定窗口的类型和窗口的外观, 窗口类型描述了部件是什么类型的窗口,比如部件是对话框、窗口、弹出窗口、子窗口等,部件只能是一种窗口类型,窗口外观描述了窗口的外观,比如窗口是否有关闭按钮、是否有最大化最小化按钮、是否有标题栏等,窗口外观可以同时指定多个。
3、 窗口标志使用 Qt::WindowType 枚举(标志为 Qt::WindowFlags)描述,该枚举值被分为两部件,即窗口类型部分和窗口提示部分, 其中窗口类型位于低位字段,这些字段的任一组合都是另一种窗口类型,这间接限制了部件只能有一种窗口类型。 窗口提示位于高位字段,它描述了部件的外观,窗口提示可以有多个,且仅影响顶级窗口。
4、窗口的特点:
-
窗口默认不可见,需调用 show()等函数才能使其可见。
-
在大多数平台上,窗口都会列在桌面的任务栏中。
-
若窗口具有父级,则根据窗口管理系统的不同, 子窗口通常总是位于其各自的父窗口之上,并且没有自己的任务栏条目,通常是共享父部件的任务栏条目,比如,即使子窗口处于未激活状态而父窗口处于激活状态时,子窗口仍会位于父窗口之上。 此规则对对话框同样适用。
-
窗口标志包含 Qt::Window 的部件都是窗口
5、对话框的窗口标志默认为 Qt::Dialog,值为 0x0000 0002 | Qt::Window,可见默认情况下它是一个窗口,需使用 show()等函数才能显示出来。 同理,改变 QDialog 的窗口类型,可以使 QDialog 不再是一个对话框。
6、对话框与窗口的明显区别在于对话框通常没有最大最小化按钮。
一个典型的对话框示例:
from PyQt5.QtWidgets import QApplication, QDialog
import sys
if __name__ == '__main__':
app = QApplication(sys.argv)
my_dialog = QDialog() # 使用默认构造函数构造一个对话框
my_dialog.show()
sys.exit(app.exec_())
2. 模态和非模态对话框
按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:模态的(modal)和非模态的(modeless)。
2.1 模态对话框
在同一个程序中,模态对话框会阻止用户与其他可见窗口的交互, 模态对话框通常用于需要返回值的情形,比如获取用户按下的是 Ok 还是 Cancel 键等。
2.2 模态对话框的模式
模态对话框有两种模式, application modal 应用程序模式(默认)和 window modal 窗口模式
-
应用程序模式对话框: 该模式会阻止用户与应用程序中的所有窗口的交互,直到完成与对话框的交互,并关闭该对话框,然后才能访问程序中的其他窗口。
-
窗口模式对话框:只阻止与对话框相关联的窗口的访问,允许用户在程序中继续使用其他窗口。 该模式会阻止与对话框的父窗口、所有祖先窗口及父窗口和祖先窗口的所有兄弟姐妹窗口的交互,除这些窗口外,该模式仍可与其他窗口交互。
-
注意:模态对话框不会阻止与其子窗口的交互。
2.3 设置模态对话框的方法
- 使用 QDialog::exec()函数,这是常用的方法。调用 QDialog::exec()函数后不会立即返回,需结束对话框才会返回该函数。
my_dialog = QDialog()
my_dialog.exec()
- 使用 QDialog::setModal()或 QWidget::setWindowModality(),然后使用 show()函数。与QDialog::exec()不同的是show()会立即把控制权返回给调用方。
my_dialog = QDialog()
my_dialog.setModal(True)
my_dialog.show()
3. 标准对话框
QT提供了一些常用的对话框类型,它们全部都继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。
从类的继承关系图上,我们可以看出来,有8个标准对话框继承自QDialog类,它们分别是:
- QMessageBox 类(消息对话框)
- QErrorMessage 类(错误消息对话框)
- QColorDialog 类(颜色对话框)
- QFontDialog 类(字体对话框)
- QFileDialog 类(文件对话框)
- QInputDialog 类(输入对话框)
- QProgressDialog 类(进度对话框)
- QWizard 类(向导)