简易对话框
简述
简易对话框是指,对话框的调用者会把对话框中的各窗口部件全部设置为初始,也可以由对话框调用者直接获取各窗口部件的最终值。
简易对话框不掌握各窗口部件中用于编辑和显示的数据。可以对简易对话框各窗口部件使用一些基本的验证,不过对一些相互依赖的窗口部件进行验证并不常见(或者说,通常不允许);
换言之,在简易对话框中通常不会做窗体验证。简易对话框是模态对话框,有一个”接受按钮”,比如OK和Cancel按钮
使用简易对话框最主要优点是借助API后,就无须为其再编写任何代码了,也无须为其他逻辑关系编写任何代码,之所以有这些好处,是因为简易对话框的各个窗口部件都可以直接获得。而最主要的不足是使用简易对话框的代码需要与其用户界面相关联(因为是直接访问各窗口部件的),所以就不容易实现出复杂的验证方案—且如果需要多次应用这个对话框,简易对话框就不如标准对话框或者智能对话框那么方便了。
我们先分析这一段代码
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")
在创立标签时,我们传入标签的名字时候传入的是,&+标签的名字。
这样会产生两种含义:
1. 这个符号仅仅就是一个字面上的与字符
2. 这个符号不会被显示出来,不过紧跟其后的字符会显示为下划线的形式。用以说明这是一个键盘加速器。 例如:&Width 加速键就是”alt+w”。
布局的一些常用方法
语法 | 说明 |
---|---|
b.addLayout( l ) | 把QLayout l 添加到QBoxLayout b中,b通常是QHBoxLayout 或者 QVBoxLayout |
b.addSpacing( i ) | 把固定大小为int i 的QSpaceItem条件到布局b中 |
b.addStretch( i ) | 把最小大小0和伸展因子为int i 的QSpeceItem添加到布局b中 |
b.addWidget( w ) | 向布局b中添加一个QWidget w |
b.setStretchFactor(x, i) | 把布局b中的布局或窗口部件的伸展因子由x设置为 int i |
g.addLayout(l, r, c) | 把QLayout l 添加到QGridLayout g 的第int r 行和第int c列, 可以额外的给定要合并的行数和列数 |
g.addWidget(w, r, c) | 把QWidget w 添加到QGridLayout g的第int r 行 和第int c 列,可以额外给定要合并的行数和列数 |
g.setRowStretch(r, i) | 把QGridLayout g 的行r拉伸到int i |
g.setColumnStretch(c, i) | 把QGridLayout g 的列c拉伸到int 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 = "<br>Beveled"
self.label.setText("Width = %d <br>Style=%s%s" % (self.width, 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)
beveleCheckBox = QCheckBox("&Beveled edges")
beveleCheckBox.setChecked(self.beveled)
styleLabel = QLabel("&Style:")
styleComboBox = QComboBox()
styleLabel.setBuddy(styleComboBox)
styleComboBox.addItems(["Soild", "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(beveleCheckBox, 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 = beveleCheckBox.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) # 每一个PyQt应用都必须有一个QApplication对象
form = Form()
form.show()
sys.exit(app.exec_())