7月
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_())