QDialog 与 QApplication 的事件循环
QDialog 自身运行时会触发一个事件循环, 这个事件循环与 QApplication 的事件循环并没有显著的从属关系,可以认为它们是独立的。
值得注意得是,QApplication 并不会因为所有 QDialog 都关闭了就自动退出 exec() 事件循环。
示例代码
代码语言:python代码运行次数:0复制from PySide6.QtWidgets import QApplication, QDialog
if __name__ == '__main__':
app = QApplication()
print('QApplication start running...')
ins = QDialog()
ins.setWindowTitle('QDialog Window')
ins.exec() # 开启 QDialog 事件循环
print('QDialog quit...')
app.exec() # 开启 QApplication 事件循环
print('QApplication quit...')
运行效果
在QMainWindow中触发QDialog窗口
QDialogButtonBox 有一些内置的信号,当用户与按钮交云时信号会被触发。
示例代码
代码语言:python代码运行次数:0复制from __future__ import annotations
from PySide6.QtCore import QSize
from PySide6.QtWidgets import QApplication, QDialog, QMainWindow, QPushButton
class ShowDialogWhenPushButton(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('触发 QDialog 窗口')
self.button = QPushButton('点击触发')
self.button.clicked.connect(self.trigger_dialog)
self.setCentralWidget(self.button)
def trigger_dialog(self):
dialog = QDialog(self)
dialog.setWindowTitle('这是 QDialog 窗口')
dialog.setToolTip('当前窗口是 QDialog 窗口')
dialog.setFixedSize(QSize(300, 300))
# dialog.setModal(False)
# 当 dialog 窗口运行时,父窗口无法被点击或操作
# 只有关闭了 dialog 窗口后父窗口才可以被点击或操作
dialog.exec()
if __name__ == '__main__':
app = QApplication()
ins = ShowDialogWhenPushButton()
ins.show()
app.exec()
运行效果
在QDialog中引入QDialogButtonBox
示例代码
代码语言:python代码运行次数:0复制from __future__ import annotations
import sys
from datetime import datetime
from PySide6.QtWidgets import QAbstractButton, QApplication, QDialog, QDialogButtonBox, QVBoxLayout
def get_time_str() -> str:
return datetime.now().isoformat(sep = ' ')
def my_accepted():
print(f'{get_time_str()} acceptedn')
def my_rejected():
print(f'{get_time_str()} rejectedn')
def my_help_requested():
print(f'{get_time_str()} help requestedn')
class MyDialogButtonWindow(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle('Dialog Buttons')
self.dialog_button_flags = QDialogButtonBox.StandardButton.Ok
# 设置按钮的标志
for button in QDialogButtonBox.StandardButton:
if button == QDialogButtonBox.StandardButton.NoButton:
continue
self.dialog_button_flags |= button
# 这里需要显式的生成按钮实例
self.dialog_button = QDialogButtonBox(self.dialog_button_flags)
# 点击按钮时设置对应的槽函数,在槽函数中打印按钮名称
self.dialog_button.clicked.connect(self.clicked)
self.dialog_button.accepted.connect(my_accepted)
self.dialog_button.rejected.connect(my_rejected)
self.dialog_button.helpRequested.connect(my_help_requested)
# 设置按钮的布局
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.dialog_button)
self.setLayout(self.v_layout)
# 当 dialog 对话框退出时其返回的状态信息
self.finished.connect(self.my_finished)
def clicked(self, button: QAbstractButton):
# 获取按钮名称,这里一定要调用 standardButton(xxx) 方法,而不是 StandardButton(xxx)
print(f'{get_time_str()} clicked: {self.dialog_button.standardButton(button)} {self.dialog_button.buttonRole(button)}')
def my_finished(self, result: int):
if result == QDialog.DialogCode.Accepted:
print(f'{get_time_str()} QDialog Window Finished: {result}(QDialog.DialogCode.Accepted)')
elif result == QDialog.DialogCode.Rejected:
print(f'{get_time_str()} QDialog Window Finished: {result}(QDialog.DialogCode.Rejected)')
else:
print(f'{get_time_str()} QDialog Window Finished: {result}(Unknown QDialogCode)')
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
ins = MyDialogButtonWindow()
ins.setWindowTitle('对话框程序')
ins.exec() # 模态对话框开启独立的事件循环,此时不需要单独开启 app.exec() 事件循环
sys.exit(0)