PySide6 GUI 编程(24):QDialog以及QDialogButtonBox

2024-08-12 15:06:22 浏览数 (3)

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...')

运行效果

QDialog 运行时QDialog 运行时
关闭 QDialog 窗口后进入 QApplication 的事件循环关闭 QDialog 窗口后进入 QApplication 的事件循环

在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 窗口模态 QDialog 窗口

在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)
核心代码逻辑核心代码逻辑

运行效果

QDialog 与 QDialogButtonBoxQDialog 与 QDialogButtonBox
QDialog 按钮点击效果示例QDialog 按钮点击效果示例

QDialogButtonBox按钮与信号分类

按钮类型与信号汇总按钮类型与信号汇总

0 人点赞