七月 16

Pyside2使用widget建立表单代码示例

import sys
from PySide2 import QtWidgets as qtw
from PySide2 import QtGui as qtg
from PySide2 import QtCore as qtc

class IPv4Validator(qtg.QValidator):
    """检查输入的是否是IPv4地址"""
    def validate(self, arg__1, arg__2):
        octet = arg__1.split('.')
        if len(octet) > 4:
            state = qtg.QValidator.Invalid
        elif not all(x.isdigit() for x in octet if x != ''):
            state = qtg.QValidator.Invalid
        elif not all(255 >= int(x) >= 0 for x in octet if x != ''):
            state = qtg.QValidator.Invalid
        elif len(octet) < 4:
            state = qtg.QValidator.Intermediate
        elif any(x == '' for x in octet):
            state = qtg.QValidator.Intermediate
        else:
            state = qtg.QValidator.Acceptable
        return state

class ChoiceSpinBox(qtw.QSpinBox):
    """带有文字选项的spin box"""
    def __init__(self, choices, *args, **kwargs):
        self.choices = choices
        super().__init__(*args, maximum=len(self.choices)-1, minimum=0, **kwargs)

    def valueFromText(self, text):
        return self.choices.index(text)

    def textFromValue(self, val):
        try:
            return self.choices[val]
        except IndexError:
            return '!Error!'

    def validate(self, input, pos):
        if input in self.choices:
            state = qtg.QValidator.Acceptable
        elif any(v.startswith(input) for v in self.choices):
            state = qtg.QValidator.Intermediate
        else:
            state = qtg.QValidator.Invalid
        return state

# 将主程序封装成类
class MainWindow(qtw.QWidget):
    def __init__(self):
        # 引入父类的__init__方法
        super().__init__(parent=None)
        # Main UI code goes here

        # 创建和设置各种widget

        # 注意在构造QLabel时,第一个参数为显示的字符串,第二个参数才是parent
        label = qtw.QLabel('<b>我是一个QLabel!</b>', self, margin=10)

        # 单行的文字编辑框
        line_edit = qtw.QLineEdit('我是一个QLineEdit', self, placeholderText='在此输入')

        # 注意快捷键设置要使用QtGui中的QKeySequence类的对象。
        # 构造QKeySequence对象可以用字符串QKeySequence('ctrl+p'),也可用enum值QKeySequence(qtc.Qt.CTRL + qtc.Qt.Key_P)
        button = qtw.QPushButton('我是一个QPushButton', self, shortcut=qtg.QKeySequence('ctrl+p'))

        # 组合框不能在构造函数中初始化选项,需要在后面用addItem或者insertItem方法
        combobox = qtw.QComboBox(self, editable=True, insertPolicy=qtw.QComboBox.InsertAtTop)
        # addItem中的第一个参数为显示的标签,第二个参数为对应的数据值。这个数据值可以是数字,字符串或者python类
        # 当前选定的数据值可以用currentData方法获得
        combobox.addItem('Lemon', 1)
        combobox.addItem('Peach', 'Ohh I like Peaches!')
        combobox.addItem('Strawberry', qtw.QWidget)
        combobox.insertItem(1, 'Radish', 2)
        # 如果我们不需要给选项绑定对应的数据值,我们可以使用addItems和insertItems来一次添加多个选项

        # 注意QSpinBox中只有value对应的数字的部分是可以编辑的。其他的字符部分都是不可编辑的。输入的字符也必须是数字,但不必要考虑singleStep。
        # QDoubleSpinBox和QSpinBox类似,只是QDoubleSpinBox的数值为浮点数,而QSpinBox的数值为整数。
        spinbox = qtw.QSpinBox(self, value=12, maximum=100, minimum=10, prefix='$', suffix=' +Tax', singleStep=5)

        # 除了QDateTimeEdit,还有QDateEdit和QTimeEdit
        # QDate,QTime和QDateTime都属于QtCore。除此之外,也可以使用python标准的date,time和datetime
        datetimebox = qtw.QDateTimeEdit(self,
                                        date=qtc.QDate.currentDate(),
                                        time=qtc.QTime.currentTime(),
                                        calendarPopup=True,
                                        maximumDate=qtc.QDate(2030, 1, 1),
                                        maximumTime=qtc.QTime(17, 0),
                                        displayFormat='yyyy-MM-dd HH:mm')

        # 和QLineEdit相比,QTextEdit可以显示或者编辑多行文本,并且支持富文本。
        textedit = qtw.QTextEdit(self,
                                 acceptRichText=False,
                                 lineWrapMode=qtw.QTextEdit.FixedColumnWidth,
                                 lineWrapColumnOrWidth=25,
                                 placeholderText='请输入文字')

        # 创建和设置各种layout
        # 设置主layout
        layout = qtw.QVBoxLayout()
        self.setLayout(layout)
        layout.addWidget(label)
        layout.addWidget(line_edit)

        # 设置子layout
        sublayout = qtw.QHBoxLayout()
        layout.addLayout(sublayout)
        sublayout.addWidget(button)
        sublayout.addWidget(combobox)

        # 设置QGridLayout
        grid_layout = qtw.QGridLayout()
        # layout.addLayout(grid_layout)
        grid_layout.addWidget(spinbox, 0, 0)
        grid_layout.addWidget(datetimebox, 0, 1)
        grid_layout.addWidget(textedit, 1, 0, 2, 2)

        # 设置QFormLayout
        form_layout = qtw.QFormLayout()
        layout.addLayout(form_layout)
        form_layout.addRow('Item 1', qtw.QLineEdit(self))
        form_layout.addRow('Item 2', qtw.QLineEdit(self))
        form_layout.addRow(qtw.QLabel('<b>This is a label-only row</b>'))

        # 设置widget的尺寸
        label.setFixedSize(150, 40)
        line_edit.setMinimumSize(150, 15)
        line_edit.setMaximumSize(500, 50)
        spinbox.setSizePolicy(qtw.QSizePolicy.Fixed, qtw.QSizePolicy.Preferred)
        textedit.setSizePolicy(qtw.QSizePolicy.MinimumExpanding, qtw.QSizePolicy.MinimumExpanding)

        # 利用addWidget方法中的stretch参数设置
        stretch_layout = qtw.QHBoxLayout()
        layout.addLayout(stretch_layout)
        stretch_layout.addWidget(qtw.QLineEdit('short'), 1)
        stretch_layout.addWidget(qtw.QLineEdit('long'), 2)

        # 使用QTabWidget
        tab_widget = qtw.QTabWidget(movable=True, tabPosition=qtw.QTabWidget.West, tabShape=qtw.QTabWidget.Triangular)
        layout.addWidget(tab_widget)
        container = qtw.QWidget()
        container.setLayout(grid_layout)
        tab_widget.addTab(container, 'Tab the first')

        # 使用QGroupBox
        groupbox = qtw.QGroupBox('Buttons', checkable=True, checked=True, alignment=qtc.Qt.AlignHCenter, flat=True)
        groupbox.setLayout(qtw.QHBoxLayout())
        groupbox.layout().addWidget(qtw.QPushButton('Ok'))
        groupbox.layout().addWidget(qtw.QPushButton('Cancel'))
        layout.addWidget(groupbox)

        # 使用QValidator
        line_edit.setText('0.0.0.0')
        line_edit.setValidator(IPv4Validator())

        # 创建带字符串的spin box
        ratingbox = ChoiceSpinBox(('bad', 'average', 'good', 'awesome'), self)
        sublayout.addWidget(ratingbox)

        # End main UI code

        # 显示主窗口
        self.show()

if __name__ == '__main__':
    app = qtw.QApplication()
    main_window = MainWindow()
    sys.exit(app.exec_())


文章由安静原创,发表于www.ajnote.com。转载请注明出处

发表 2020年7月16日 自 anjing 类别 "Pyside2学习笔记

发表评论

电子邮件地址不会被公开。 必填项已用*标注