QDialog简介
对话框是GUI应用中一个重要组成部分。在GUI应用中,对话框常用于输入修改数据,选择文件、字体、颜色,参数配置,消息显示等交互操作。
QDialog类是所有对话框窗口类的的基类,一个对话框应用类一般都从QDialog类或者其子类派生。QDialog常用来完成一个交互任务或者作为应用的顶层窗口使用。
对话框一般分为模态对话框和非模态对话框两种表现形式。
- 模态对话框在关闭它之前,不能与同一个应用程序的其他窗口进行交互,它是阻塞式调用方式,模态对话框通过调用exec()函数实现,使用模态对话框时,事件就在对话框内部循环,必须将对话框关闭才能继续执行主界面的操作。对于参数选择的对话框,一般用模态对话框。
- 非模态对话框既可以和它交互,也可以和同一个应用程序的其他窗口交互。它是非阻塞式调用方式,非模态对话框调用show()函数实现。非模态对话框一般需要指定属性Qt.WA_DeleteOnClose属性,该属性表示关闭对话框的同时删除对话框对象。对于显示或查看某些内容的对话框,一般用非模态对话框。
- 通过QDialog.setModal方法可以创建混合特性的对话框(其表现形式和模态对话框相同)。
QDialog常用方法有:
- setVisible(): 设置对话框是否可见;
- setModal(): 设置是否启动模态对话框模式;
- exec(): 模态对话框模式下,启动对话框;
- done(): 关闭对话框,并发射finished信号;
- reject(): 关闭对话框,返回QDialog.Rejected,发射rejected信号;
- accept(): 关闭对话框,返回QDialog.Accepted,发射accepter信号。
QDialog常用信号:
- finished: 调用方法done()时,发射该信号;
- accepted: 调用方法accept()时,发射该信号;
- rejected: 调用方法rejected()时, 发射该信号
注:exec() 对象的返回的代码判断操作,和信号操作是两回事;
判断弹窗返回代码在exec() 之后。信号操作在exec()之前。
QDialog类继承关系:

测试QDialog
创建文件qdialo.py, 创建三个按钮,分别测试模态模式,常规模式和混合模式(和模态模式的行为一样)对话框。完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QApplication, QWidget, QDialog, QPushButton, QVBoxLayout, QHBoxLayout, QPlainTextEdit) class DemoDialog(QWidget): def __init__(self, parent=None): super(DemoDialog, self).__init__(parent) # 设置窗口标题 self.setWindowTitle('实战PyQt5: QDialog Demo!') # 设置窗口大小 self.resize(400, 320) self.initUi() def initUi(self): #创建一个垂直布局 vLayout = QVBoxLayout(self) #设置内部控件之间的间隔 btnModal = QPushButton('模态对话框测试', self) btnModal.clicked.connect(self.onModalDialog) btnNormal = QPushButton('常规对话框测试', self) btnNormal.clicked.connect(self.onNormalDialog) btnMixed = QPushButton('混合对话框测试', self) btnMixed.clicked.connect(self.onMixedDialog) hLayout = QHBoxLayout(self) hLayout.addWidget(btnModal) hLayout.addWidget(btnNormal) hLayout.addWidget(btnMixed) vLayout.addLayout(hLayout) vLayout.addWidget(QPlainTextEdit(self)) self.setLayout(vLayout) def onModalDialog(self): dlg = QDialog(self) dlg.setWindowTitle('模态对话框') dlg.resize(240, 136) dlg.exec() def onNormalDialog(self): dlg = QDialog(self) dlg.setWindowTitle('常规对话框') dlg.resize(240, 136) #设置该属性即可在让在该窗口关闭时就可以释放 dlg.setAttribute(Qt.WA_DeleteOnClose) dlg.show() def onMixedDialog(self): dlg = QDialog(self) dlg.setWindowTitle('混合对话框') dlg.resize(240, 136) dlg.setAttribute(Qt.WA_DeleteOnClose) #设置非模态对话框的行为类似模态对话框 dlg.setModal(True) dlg.show() if __name__ == '__main__': app = QApplication(sys.argv) window = DemoDialog() window.show() sys.exit(app.exec()) |
运行结果如下图:

测试QDialog
本文知识点
- QDialog是其他对话框类的基类;
- 模态对话框和非模态对话框的区别和应用场景;
- 执行done(), accept()和reject()方法后对应所发的信号。
前一篇: 实战PyQt5: 054-堆栈布局QStackedLayout