pyqt5学习笔记(三)

时间:2021-07-26 08:05:57

简易对话框


简述

简易对话框是指,对话框的调用者会把对话框中的各窗口部件全部设置为初始,也可以由对话框调用者直接获取各窗口部件的最终值。
简易对话框不掌握各窗口部件中用于编辑和显示的数据。可以对简易对话框各窗口部件使用一些基本的验证,不过对一些相互依赖的窗口部件进行验证并不常见(或者说,通常不允许);
换言之,在简易对话框中通常不会做窗体验证。简易对话框是模态对话框,有一个”接受按钮”,比如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_())