Python版本3.7
PySide2 Version: 5.14.1
官方文档:http://doc.qt.io/qtforpython/index.html
前面讨论了消息对话框和文件对话框,其实QT还为我们提供其它对话框,比如颜色选择的对话框,打印对话框等等,使用方法都是大同小异,一个是通过类的静态方法,另一个是通过实例对象。这些对话框都属于QDialog
类的子类,所以,了解一下QDialog
可以更好的掌握这些对话框。
对话框一般有两种对话框,一是模式(模态)对话框,另一种是非模式(非模态)对话框,然而在模式对话框下,又有两种情况,一是应用程序模式,另一种是窗口模式。对于模式对话框,它的特点是会阻塞其它窗口的交互,必须先完成当前对话框的交互才能进行其它窗口的交互。在应用程序模式下,模式对话框会阻塞同一个应用程序下其它所有窗口的交互,直到用户关闭对话框,而在窗口模式下,它只会阻塞它父窗口的交互。默认情况下,对话框被设置为应用程序模式对话框。非模式对话框不会阻塞其它窗口,它是独立于同一应用程序的窗口。
开启一个模式对话框最常用的方式就是调用exec_()
函数(注意调用exec_()会立即阻塞,即后面的代码不会执行,直到exec_函数返回),当用户关闭模式对话框时,exec_()
会返回一个值。但是官网手册建议我们使用open()
函数,这个并不会立即阻塞,它会异步执行,会执行完后面的代码,结果我测试使用open()
函数,为啥显示的对话框不是个完整的对话框,不知道是怎么回事。开启一个非模式对话框可以调用show()
函数,但是在显示之前还需要设置一下,调用setModal(False)
,用于设置对话框类型,毕竟show()
函数只是一个显示函数。到这里其实如果自己多尝试一下就会有新的发现。
执行以下代码:
messagebox = QMessageBox(parent)
messagebox.setText('content')
# 也可以不写这一行,因为默认就是模式对话框
messagebox.setModal(True)
# 不调用exec_()
messagebox.show()
print('after')
你会发现,这个消息对话框是模式对话框,并且执行了print函数,如果调用exec_这个函数的话,就不会执行print,所以是不是可以使用这个方法来代替open()
函数呢,暂不知道有什么影响,慎用。
QDialog
中还有几个信号和函数值得了解。
三个信号分别是finished(result)
,accepted()
,rejected()
三个函数分别是done(arg_1)
,accept()
,reject()
调用accept()
,reject()
的效果是隐藏模式对话框,然后将返回值设置为Accepted
或Rejected
调用done(arg_1)
是关闭对话框,并将返回值设置为arg_1,并发送finished(result)信号,result就是arg_1,如果result是Accepted
或Rejected
将会发送accepted()
或rejected()
信号。
以下以QMessageBox为例子
from PySide2.QtWidgets import QWidget, QPushButton, QApplication, QMessageBox, QGridLayout
from PySide2.QtCore import Signal, Slot
class MyWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.btn_dialog01 = QPushButton('打开模式对话框01')
self.btn_dialog01.clicked.connect(self.openMessageBox01)
self.btn_dialog02 = QPushButton('打开非模式对话框02')
self.btn_dialog02.clicked.connect(self.openMessageBox02)
self.btn_dialog03 = QPushButton('打开模式对话框03')
self.btn_dialog03.clicked.connect(self.openMessageBox03)
self.layout = QGridLayout()
self.layout.addWidget(self.btn_dialog01, 1, 1)
self.layout.addWidget(self.btn_dialog02, 1, 2)
self.layout.addWidget(self.btn_dialog03, 1, 3)
self.setLayout(self.layout)
@Slot()
def openMessageBox01(self):
messagebox = QMessageBox(self)
messagebox.setText('content01')
messagebox.exec_()
print('after01')
@Slot()
def openMessageBox02(self):
messagebox = QMessageBox(self)
messagebox.setText('content02')
messagebox.setModal(False)
messagebox.show()
print('after02')
@Slot()
def openMessageBox03(self):
messagebox = QMessageBox(self)
messagebox.setText('content03')
messagebox.show()
print('after03')
app = QApplication()
widget = MyWidget()
widget.show()
app.exec_()
运行截图:
友情链接:
QDialog