实战PyQt5: 055-对话框QDialog

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类继承关系:

实战PyQt5: 055-对话框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())

运行结果如下图:

实战PyQt5: 055-对话框QDialog

测试QDialog

本文知识点

  • QDialog是其他对话框类的基类;
  • 模态对话框和非模态对话框的区别和应用场景;
  • 执行done(), accept()和reject()方法后对应所发的信号。

前一篇: 实战PyQt5: 054-堆栈布局QStackedLayout