QDialog 对话窗口基类
- 描述
- 是对话窗口的基类
- 对话窗口是顶级窗口,主要用于短期任务和与用户的简短通信。
- 是一个空白的窗口
- QDialog可能是模态的或非模态对话框
- 模态对话框
- 应用程序级别(默认值)
- 当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口
- 打开方式:obj.exec()
- 应用场景:
- 窗口级别
- 该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互
- 打开方式:obj.open()
- 应用场景:文件选择、是否同意
- 应用程序级别(默认值)
- 非模态对话框
- 不会阻塞与对话框关联的窗口以及与其他窗口进行交互
- 打开方式:obj.show()
- 结合
setModal(True)
也可以实现模态对话框 - 结合
setWindowModality(Qt.WindowModal)
也可以实现模态对话框Qt.WindowModal
设置为窗口级别Qt.ApplicationModal
设置为应用程序级别
- 应用场景:查找替换
- 模态对话框
- QDialogs可以提供返回值,它们可以有默认按钮
- 继承自:QWidget
- 功能作用
-
构造函数
QDialog(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags())
-
弹出
exec() # 以应用程序级别模态对话框模式弹出 open() # 以窗口级别模态对话框模式弹出 show() # 以非模态对话框模式弹出
-
模态设置
setModal(bool) # 设置对话框是否为窗口级别模态对话框 setWindowModality(Qt.WindowModal) # 将非模态对话框设置为指定级别的模态对话框 # 参数:Qt.WindowModal Qt.WindowModal # 设置为窗口级别 Qt.ApplicationModal # 设置为应用程序级别 modal() -> bool # 获取对话框模态 # 一般在show()方法弹出为非模态对话框模式时才使用
-
是否显示尺寸调整控件
- 右下角多出一个小控件
setSizeGripEnabled(bool) # 设置是否显示尺寸调整控件 isSizeGripEnabled() -> bool # 获取是否设置显示尺寸调整控件
-
常用操作槽函数
- 通过返回值识别用户的操作
accept() # 确认,返回1 reject() # 取消,返回0 done(int r) # 完成,返回自定义的r # 在accept()和reject()槽函数中,最后都调用了done()槽函数 # 在按钮上通过信号连接对应的槽函数,执行对话框的槽函数会触发对应的信号
-
设置和获取数值
setResult(int) # 设置对话框返回值 result() -> int # 获取对话框设置的返回值
-
- 注意:这里的模态设置、添加控件等操作都需要在弹出之前设置好(也就是要在窗口显示之前先设置好,否则窗口已经展示出来了,其他控件或者设置都未调用就无法显示了)
- 可用信号
accepted() # 执行accept槽函数时发射该信号 rejected() # 执行reject槽函数时发射该信号 finished(int result) # 执行done槽函数时发射该信号,并传递返回值 # 由于在accept()和reject()槽函数中,最后都调用了done()槽函数,所以执行三个槽函数都会发射finished()信号 # 个人测试时发现用exec()弹出应用程序级别模态对话框,执行槽函数时并不会发射信号
- 示例代码
- 示例1:QDialog-功能作用
from PyQt5.Qt import * import sys class MyDialog(QDialog): def done(self, a0: int) -> None: super(MyDialog, self).done(a0) print('执行了done函数') class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QDialog-功能作用') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): # dialog = QDialog(self) dialog = MyDialog(self) dialog.setWindowTitle('QDialog选择窗口') # ****************弹出功能****************** 开始 # dialog.exec() # 以应用程序级别模态对话框弹出 # dialog.open() # 以窗口级别模态对话框弹出 # dialog.show() # 以非模态对话框弹出 # ****************弹出功能****************** 结束 pass # ****************非模态转换为模态对话框****************** 开始 # dialog.setModal(True) # dialog.setWindowModality(Qt.WindowModal) # dialog.setWindowModality(Qt.ApplicationModal) # dialog.show() # ****************非模态转换为模态对话框****************** 结束 pass # ****************设置右下角显示调整大小控件****************** 开始 # dialog.setSizeGripEnabled(True) # ****************设置右下角显示调整大小控件****************** 结束 pass # ****************常用操作槽函数****************** 开始 btn1 = QPushButton(dialog) btn1.setText("确定") btn1.move(50, 50) btn1.clicked.connect(lambda :dialog.accept()) btn2 = QPushButton(dialog) btn2.setText("取消") btn2.move(50, 100) btn2.clicked.connect(lambda: dialog.reject()) btn2 = QPushButton(dialog) btn2.setText("自定义") btn2.move(50, 150) btn2.clicked.connect(lambda val: dialog.done(8)) # result = dialog.open() # result = dialog.exec() # print(result) # ****************常用操作槽函数****************** 结束 pass # ****************设置返回值****************** 开始 # btn4 = QPushButton(dialog) # btn4.setText("设置返回值") # btn4.move(50,200) # btn4.clicked.connect(lambda :dialog.setResult(888)) # # btn5 = QPushButton(dialog) # btn5.setText("打印返回值") # btn5.move(50, 250) # btn5.clicked.connect(lambda: print(dialog.result())) # # result = dialog.exec() # print(result) # ****************设置返回值****************** 结束 pass # ****************可用信号****************** 开始 dialog.open() # dialog.show() # dialog.exec() # 应用程序级别模态对话框不发射信号 dialog.accepted.connect(lambda :print("点击了“确定”按钮")) dialog.rejected.connect(lambda :print("点击了“取消”按钮")) dialog.finished.connect(lambda val:print("点击了“完成”按钮", val)) # ****************可用信号****************** 结束 if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())