Bootstrap

PyQt6/PySide6 的 QDialog 类

QDialog 是 PyQt6 或 PySide6 库中用于创建对话框的类。对话框是一种特殊的窗口,通常用于与用户进行短期交互,如输入信息、显示消息或选择选项等。QDialog 提供了丰富的功能和灵活性,使得开发者可以轻松地创建各种类型的对话框。下面我将详细介绍 QDialog 的主要特性及其使用方法。

1. 基本概念

  • 对话框:一种临时性的窗口,通常用于完成特定任务或获取用户的输入。
  • 模态对话框:当打开时会阻止用户与应用程序的其他部分进行交互,直到对话框关闭。
  • 非模态对话框:允许用户在对话框打开的同时与应用程序的其他部分进行交互。

2. 创建 QDialog 实例

要使用 QDialog,首先需要导入相应的库:

from PyQt6.QtWidgets import QApplication, QDialog, QVBoxLayout, QPushButton, QLabel, QLineEdit
# 或者
from PySide6.QtWidgets import QApplication, QDialog, QVBoxLayout, QPushButton, QLabel, QLineEdit

接着创建一个继承自 QDialog 的子类,并实现构造函数来初始化对话框:

class MyDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我的对话框")
        self.setGeometry(100, 100, 400, 300)
      
        # 初始化UI
        self.initUI()
  
    def initUI(self):
        # 在这里添加你的控件和其他UI元素
        layout = QVBoxLayout()
      
        label = QLabel("请输入您的名字:")
        self.name_input = QLineEdit()
      
        ok_button = QPushButton("确定")
        cancel_button = QPushButton("取消")
      
        layout.addWidget(label)
        layout.addWidget(self.name_input)
        layout.addWidget(ok_button)
        layout.addWidget(cancel_button)
      
        self.setLayout(layout)
      
        # 连接按钮信号到槽函数
        ok_button.clicked.connect(self.accept)
        cancel_button.clicked.connect(self.reject)

3. 模态与非模态对话框

模态对话框

模态对话框在显示时会阻止用户与主窗口或其他窗口进行交互。可以通过调用 exec() 方法来显示模态对话框。

def show_modal_dialog():
    dialog = MyDialog()
    result = dialog.exec()
    if result == QDialog.Accepted:
        print(f"用户输入的名字: {dialog.name_input.text()}")
    else:
        print("用户取消了对话框")

if __name__ == "__main__":
    app = QApplication([])
    show_modal_dialog()
    app.exec()
非模态对话框

非模态对话框允许用户在对话框打开的同时与应用程序的其他部分进行交互。可以通过调用 show() 方法来显示非模态对话框。

def show_non_modal_dialog():
    dialog = MyDialog()
    dialog.show()

if __name__ == "__main__":
    app = QApplication([])
    show_non_modal_dialog()
    app.exec()

4. 对话框结果处理

QDialog 提供了两个标准的结果代码:QDialog.AcceptedQDialog.Rejected。你可以通过重写 accept()reject() 方法来自定义这些行为。

class MyDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我的对话框")
        self.setGeometry(100, 100, 400, 300)
      
        # 初始化UI
        self.initUI()
  
    def initUI(self):
        layout = QVBoxLayout()
      
        label = QLabel("请输入您的名字:")
        self.name_input = QLineEdit()
      
        ok_button = QPushButton("确定")
        cancel_button = QPushButton("取消")
      
        layout.addWidget(label)
        layout.addWidget(self.name_input)
        layout.addWidget(ok_button)
        layout.addWidget(cancel_button)
      
        self.setLayout(layout)
      
        # 连接按钮信号到槽函数
        ok_button.clicked.connect(self.accept)
        cancel_button.clicked.connect(self.reject)
  
    def accept(self):
        if self.name_input.text().strip():
            super().accept()
        else:
            QMessageBox.warning(self, "错误", "名字不能为空!")
  
    def reject(self):
        reply = QMessageBox.question(self, '确认', '您确定要取消吗?',
                                     QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
                                     QMessageBox.StandardButton.No)
        if reply == QMessageBox.StandardButton.Yes:
            super().reject()

5. 使用预定义的对话框

PyQt6/PySide6 提供了一些预定义的对话框类,例如 QFileDialogQColorDialogQMessageBox 等,可以直接使用它们来简化开发过程。

文件对话框
from PyQt6.QtWidgets import QFileDialog

def open_file_dialog():
    file_name, _ = QFileDialog.getOpenFileName(None, "选择文件", "", "All Files (*);;Text Files (*.txt)")
    if file_name:
        print(f"选择的文件: {file_name}")

if __name__ == "__main__":
    app = QApplication([])
    open_file_dialog()
    app.exec()
颜色对话框
from PyQt6.QtWidgets import QColorDialog
from PyQt6.QtGui import QColor

def open_color_dialog():
    color = QColorDialog.getColor(initial=QColor(Qt.red))
    if color.isValid():
        print(f"选择的颜色: {color.name()}")

if __name__ == "__main__":
    app = QApplication([])
    open_color_dialog()
    app.exec()
消息对话框
from PyQt6.QtWidgets import QMessageBox

def show_message_box():
    msg_box = QMessageBox()
    msg_box.setIcon(QMessageBox.Information)
    msg_box.setText("这是一个消息对话框")
    msg_box.setWindowTitle("消息")
    msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
    result = msg_box.exec()
    if result == QMessageBox.Ok:
        print("用户点击了OK")
    else:
        print("用户点击了Cancel")

if __name__ == "__main__":
    app = QApplication([])
    show_message_box()
    app.exec()

6. 自定义对话框

除了使用预定义的对话框外,你还可以完全自定义对话框的布局和功能。这包括添加更多的控件、设置样式表、处理复杂的逻辑等。

class CustomDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("自定义对话框")
        self.setGeometry(100, 100, 600, 400)
      
        self.initUI()
  
    def initUI(self):
        layout = QVBoxLayout()
      
        # 添加更多控件
        name_label = QLabel("姓名:")
        self.name_input = QLineEdit()
      
        age_label = QLabel("年龄:")
        self.age_input = QLineEdit()
      
        email_label = QLabel("邮箱:")
        self.email_input = QLineEdit()
      
        submit_button = QPushButton("提交")
        cancel_button = QPushButton("取消")
      
        layout.addWidget(name_label)
        layout.addWidget(self.name_input)
        layout.addWidget(age_label)
        layout.addWidget(self.age_input)
        layout.addWidget(email_label)
        layout.addWidget(self.email_input)
        layout.addWidget(submit_button)
        layout.addWidget(cancel_button)
      
        self.setLayout(layout)
      
        # 连接按钮信号到槽函数
        submit_button.clicked.connect(self.submit)
        cancel_button.clicked.connect(self.reject)
  
    def submit(self):
        if self.name_input.text().strip() and self.age_input.text().strip() and self.email_input.text().strip():
            print(f"姓名: {self.name_input.text()}")
            print(f"年龄: {self.age_input.text()}")
            print(f"邮箱: {self.email_input.text()}")
            self.accept()
        else:
            QMessageBox.warning(self, "错误", "所有字段都必须填写!")

if __name__ == "__main__":
    app = QApplication([])
    dialog = CustomDialog()
    result = dialog.exec()
    if result == QDialog.Accepted:
        print("用户提交了表单")
    else:
        print("用户取消了表单")
    app.exec()

以上是关于 QDialog 类的一些基本介绍及如何在 PyQt6/PySide6 中使用它的示例。希望这能帮助你更好地理解和运用 QDialog,并能够根据具体需求创建出功能丰富且用户友好的对话框。

;