热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PyQt5简易对话框深入解析

本文详细介绍了如何在PyQt5中创建简易对话框,包括对话框的基本结构、布局管理以及源代码实现。通过实例代码,展示了如何设置窗口部件、布局方式及对话框的基本操作。

PyQt5简易对话框

简介


简易对话框是一种常用的交互方式,主要用于收集用户的简单输入或确认信息。在PyQt5中,简易对话框可以通过简单的API调用来实现,无需编写复杂的逻辑代码。这种对话框通常包含一个或多个窗口部件,如文本框、复选框等,并提供“确定”和“取消”按钮供用户操作。


简易对话框的主要特点包括:

- 对话框调用者负责初始化和获取窗口部件的值。

- 不直接处理窗口部件中的数据编辑和显示。

- 通常不执行复杂的窗体验证,仅提供基本的验证功能。

- 是模态对话框,用户必须关闭对话框才能继续操作主程序。


简易对话框的优点在于其简洁性和易用性,但缺点是代码与用户界面紧密耦合,难以实现复杂的验证逻辑,且重复使用时不如标准对话框灵活。


布局管理


在PyQt5中,布局管理是组织窗口部件的关键。以下是一些常用的布局方法:















































方法描述
b.addLayout(l)将布局l添加到QBoxLayout b中,b通常是QHBoxLayout或QVBoxLayout。
b.addSpacing(i)在布局b中添加一个固定大小为i的空白区域。
b.addStretch(i)在布局b中添加一个可伸缩的空间,其伸展因子为i。
b.addWidget(w)在布局b中添加一个QWidget w。
b.setStretchFactor(x, i)将布局b中的布局或窗口部件x的伸展因子设置为i。
g.addLayout(l, r, c)将布局l添加到QGridLayout g的第r行和第c列,可以指定合并的行数和列数。
g.addWidget(w, r, c)将QWidget w添加到QGridLayout g的第r行和第c列,可以指定合并的行数和列数。
g.setRowStretch(r, i)将QGridLayout g的第r行拉伸到i。
g.setColumnStretch(c, i)将QGridLayout g的第c列拉伸到i。

源代码示例



import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


class PenPropertiesDlg(QDialog):

def __init__(self, parent=None):

super().__init__(parent)

widthLabel = QLabel("&Width:")
self.widthSpinBox = QSpinBox()
widthLabel.setBuddy(self.widthSpinBox)
self.widthSpinBox.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.widthSpinBox.setRange(0, 24)
self.beveledCheckBox = QCheckBox("&Beveled edges")

styleLabel = QLabel('&Style:')
self.styleComboBox = QComboBox()
styleLabel.setBuddy(self.styleComboBox)
self.styleComboBox.addItems(["Solid", "Dashed", "Dotted", "DashDotted", "DashDotDotted"])
okButton = QPushButton("&OK")
cancelButton = QPushButton("Cancel")

buttOnLayout= QHBoxLayout()
buttonLayout.addStretch()
buttonLayout.addWidget(okButton)
buttonLayout.addWidget(cancelButton)
layout = QGridLayout()
layout.addWidget(widthLabel, 0, 0)
layout.addWidget(self.widthSpinBox, 0, 1)
layout.addWidget(self.beveledCheckBox, 0, 2)
layout.addWidget(styleLabel, 1, 0)
layout.addWidget(self.styleComboBox, 1, 1, 1, 2)
layout.addLayout(buttonLayout, 2, 0, 1, 3)
self.setLayout(layout)

okButton.clicked.connect(self.accept)
cancelButton.clicked.connect(self.reject)
self.setWindowTitle("Pen Properties")


class Form(QDialog):

def __init__(self):

super().__init__()

self.width = 1
self.beveled = False
self.style = "Solid"

penButtOnInline= QPushButton("Set Pen... (Dumb & Inline)")
penButton = QPushButton("Set Pen... (Dumb & Class)")
self.label = QLabel("The Pen has not been set")
self.label.setTextFormat(Qt.RichText)

layout = QVBoxLayout()
layout.addWidget(penButtonInline)
layout.addWidget(penButton)
layout.addWidget(self.label)
self.setLayout(layout)

penButtonInline.clicked.connect(self.setPenInline)
penButton.clicked.connect(self.setPenProperties)

self.setWindowTitle("Pen")
self.updateData()

def updateData(self):

bevel = ""
if self.beveled:
bevel = "
Beveled"
self.label.setText(f"Width = {self.width}
Style = {self.style}{bevel}")

def setPenInline(self):

widthLabel = QLabel("&Width:")
widthSpinBox = QSpinBox()
widthLabel.setBuddy(widthSpinBox)
widthSpinBox.setAlignment(Qt.AlignRight)
widthSpinBox.setRange(0, 24)
widthSpinBox.setValue(self.width)

beveledCheckBox = QCheckBox("&Beveled edges")
beveledCheckBox.setChecked(self.beveled)

styleLabel = QLabel("&Style:")
styleComboBox = QComboBox()
styleLabel.setBuddy(styleComboBox)
styleComboBox.addItems(["Solid", "Dashed", "Dotted", "DashDotted", "DashDotDotted"])
styleComboBox.setCurrentIndex(styleComboBox.findText(self.style))

okButton = QPushButton("&OK")
cancelButton = QPushButton("Cancel")

buttOnLayout= QHBoxLayout()
buttonLayout.addStretch()
buttonLayout.addWidget(okButton)
buttonLayout.addWidget(cancelButton)

layout = QGridLayout()
layout.addWidget(widthLabel, 0, 0)
layout.addWidget(widthSpinBox, 0, 1)
layout.addWidget(beveledCheckBox, 0, 2)
layout.addWidget(styleLabel, 1, 0)
layout.addWidget(styleComboBox, 1, 1, 1, 2)
layout.addLayout(buttonLayout, 2, 0, 1, 3)

form = QDialog()
form.setLayout(layout)

okButton.clicked.connect(form.accept)
cancelButton.clicked.connect(form.reject)
form.setWindowTitle("Pen Properties")

if form.exec_():
self.width = widthSpinBox.value()
self.beveled = beveledCheckBox.isChecked()
self.style = styleComboBox.currentText()
self.updateData()

def setPenProperties(self):

dialog = PenPropertiesDlg(self)
dialog.widthSpinBox.setValue(self.width)
dialog.beveledCheckBox.setChecked(self.beveled)
dialog.styleComboBox.setCurrentIndex(dialog.styleComboBox.findText(self.style))

if dialog.exec_():
self.width = dialog.widthSpinBox.value()
self.beveled = dialog.beveledCheckBox.isChecked()
self.style = dialog.styleComboBox.currentText()
self.updateData()

if __name__ == "__main__":

app = QApplication(sys.argv)
form = Form()
form.show()
sys.exit(app.exec_())

推荐阅读
author-avatar
珍妮20111030
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有