QDialog 类详解及常用方法
QDialog 是 PyQt5 中用于创建 对话框窗口 的基础组件,常用于用户交互(如设置选项、文件选择、消息提示等)。以下是详细功能说明及代码示例:
核心功能
- 模态与非模态:
- 模态对话框(默认):阻塞主窗口,必须关闭后才能操作其他窗口(如确认弹窗)。
- 非模态对话框:允许同时操作其他窗口(如查找替换对话框)。
- 预定义对话框:支持
QMessageBox
(消息提示)、QFileDialog
(文件选择)等子类。 - 布局管理:可添加按钮、输入框等控件,支持
QHBoxLayout
、QVBoxLayout
布局。 - 结果返回:通过
exec_()
返回用户操作结果(如Accepted
或Rejected
)。
常用方法
方法名 | 功能说明 |
---|---|
setWindowTitle(title: str) | 设置对话框标题(如 "设置参数" )。 |
setLayout(layout: QLayout) | 设置对话框布局(如 QFormLayout 表单布局)。 |
exec_() -> int | 以模态方式运行对话框,返回 Accepted (1)或 Rejected (0)。 |
accept() | 关闭对话框并返回 Accepted (通常绑定确定按钮)。 |
reject() | 关闭对话框并返回 Rejected (通常绑定取消按钮)。 |
setModal(enable: bool) | 设置是否为模态对话框。 |
result() -> int | 获取对话框结果(需在 exec_() 后调用)。 |
代码示例
1. 创建基础对话框
python
from PyQt5.QtWidgets import QDialog, QPushButton, QVBoxLayout, QLabel
class SimpleDialog(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("简单对话框")
layout = QVBoxLayout()
self.label = QLabel("点击按钮关闭对话框")
self.btn_ok = QPushButton("确定")
self.btn_ok.clicked.connect(self.accept) # 点击确定返回 Accepted
layout.addWidget(self.label)
layout.addWidget(self.btn_ok)
self.setLayout(layout)
# 使用对话框
dialog = SimpleDialog()
if dialog.exec_() == QDialog.Accepted:
print("用户点击了确定")
2. 表单输入对话框
python
from PyQt5.QtWidgets import QLineEdit, QFormLayout, QDialogButtonBox
class FormDialog(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("登录")
# 表单布局
layout = QFormLayout()
self.username = QLineEdit()
self.password = QLineEdit()
self.password.setEchoMode(QLineEdit.Password)
# 按钮组
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
layout.addRow("用户名:", self.username)
layout.addRow("密码:", self.password)
layout.addRow(buttons)
self.setLayout(layout)
# 获取用户输入
dialog = FormDialog()
if dialog.exec_() == QDialog.Accepted:
print(f"用户名: {dialog.username.text()}, 密码: {dialog.password.text()}")
预定义对话框示例
1. 消息提示框 (QMessageBox
)
python
from PyQt5.QtWidgets import QMessageBox
# 显示信息提示
QMessageBox.information(None, "提示", "文件保存成功!")
# 确认对话框
reply = QMessageBox.question(
None, "确认", "确定要删除吗?",
QMessageBox.Yes | QMessageBox.No
)
if reply == QMessageBox.Yes:
print("执行删除操作")
2. 文件选择对话框 (QFileDialog
)
python
from PyQt5.QtWidgets import QFileDialog
file_path, _ = QFileDialog.getOpenFileName(
None, "选择文件", "", "文本文件 (*.txt);;所有文件 (*)"
)
print("选中文件:", file_path)
注意事项
-
模态与非模态选择
- 模态对话框用
exec_()
启动,非模态对话框用show()
。 - 非模态对话框需避免被垃圾回收(如保存为类属性)。
- 模态对话框用
-
布局管理
- 使用
QHBoxLayout
、QVBoxLayout
或QGridLayout
管理控件,避免手动计算坐标。
- 使用
-
结果处理
- 通过
exec_()
的返回值或对话框属性传递数据(如输入框的text()
)。
- 通过
-
关闭事件
重写closeEvent
可拦截关闭操作(如提示保存未提交的数据):python
def closeEvent(self, event): reply = QMessageBox.question(self, "退出", "确认关闭?") if reply == QMessageBox.Yes: event.accept() else: event.ignore()
与 QMainWindow 的区别
特性 | QDialog | QMainWindow |
---|---|---|
用途 | 临时用户交互(弹窗) | 主应用程序窗口 |
菜单栏/工具栏 | 不支持 | 支持添加菜单栏、工具栏、状态栏 |
默认大小 | 根据内容自适应 | 需手动设置或全屏 |
通过 QDialog,可以快速创建符合用户习惯的交互界面,适用于配置、登录、文件操作等场景。结合预定义对话框能大幅提升开发效率!