警告
本节包含自动从 C++ 翻译成 Python 的代码片段,可能包含错误。
行编辑示例#
行编辑示例展示了 QLineEdit
的多种用法,并显示了各种属性和验证器对用户输入和输出效果的影响。
示例由一个单独的 Window
类组成,包含不同输入约束和显示属性的行编辑选择,可以通过从组合框中选择项目来更改这些属性。将这些内容一起展示有助于开发者选择合适的属性来与行编辑一起使用,并便于比较每个验证器对用户输入的影响。
窗口类定义#
Window
类继承了 QWidget
,并包含一个构造函数和几个槽
class Window(QWidget): Q_OBJECT # public Window(QWidget parent = None) # public slots def echoChanged(int): def validatorChanged(int): def alignmentChanged(int): def inputMaskChanged(int): def accessChanged(int): # private echoLineEdit = QLineEdit() validatorLineEdit = QLineEdit() alignmentLineEdit = QLineEdit() inputMaskLineEdit = QLineEdit() accessLineEdit = QLineEdit()
这些槽用于在组合框中选中新的验证器时,更新特定行编辑使用的验证器类型。行编辑存储在窗口中以供这些槽使用。
窗口类实现#
使用 Window
构造函数来设置行编辑、验证器和组合框,将组合框的信号连接到 Window
类的槽,并排列布局中的子小部件。
首先,我们构建一个 group box
来包含一个标签、组合框和行编辑,以便展示 echoMode
属性。
def __init__(self, parent): super().__init__(parent) echoGroup = QGroupBox(tr("Echo")) echoLabel = QLabel(tr("Mode:")) echoComboBox = QComboBox() echoComboBox.addItem(tr("Normal")) echoComboBox.addItem(tr("Password")) echoComboBox.addItem(tr("PasswordEchoOnEdit")) echoComboBox.addItem(tr("No Echo")) echoLineEdit = QLineEdit() echoLineEdit.setPlaceholderText("Placeholder Text") echoLineEdit.setFocus()
到目前为止,这些小部件还没有在布局中进行排列。最终,echoLabel
、echoComboBox
和 echoLineEdit
将被放置在 echoGroup
组合框内的垂直布局中。
类似地,我们构建组合框和小组件集合来展示 QIntValidator
和 QDoubleValidator
对行编辑内容的影响。
validatorGroup = QGroupBox(tr("Validator")) validatorLabel = QLabel(tr("Type:")) validatorComboBox = QComboBox() validatorComboBox.addItem(tr("No validator")) validatorComboBox.addItem(tr("Integer validator")) validatorComboBox.addItem(tr("Double validator")) validatorLineEdit = QLineEdit() validatorLineEdit.setPlaceholderText("Placeholder Text")
文本对齐通过另一组小部件进行演示。
alignmentGroup = QGroupBox(tr("Alignment")) alignmentLabel = QLabel(tr("Type:")) alignmentComboBox = QComboBox() alignmentComboBox.addItem(tr("Left")) alignmentComboBox.addItem(tr("Centered")) alignmentComboBox.addItem(tr("Right")) alignmentLineEdit = QLineEdit() alignmentLineEdit.setPlaceholderText("Placeholder Text")
QLineEdit
支持使用 inputMask
。这些规格仅允许用户在行编辑器中输入符合简单规定的字符。我们构造了一组小部件来演示一组预定义的掩码。
inputMaskGroup = QGroupBox(tr("Input mask")) inputMaskLabel = QLabel(tr("Type:")) inputMaskComboBox = QComboBox() inputMaskComboBox.addItem(tr("No mask")) inputMaskComboBox.addItem(tr("Phone number")) inputMaskComboBox.addItem(tr("ISO date")) inputMaskComboBox.addItem(tr("License key")) inputMaskLineEdit = QLineEdit() inputMaskLineEdit.setPlaceholderText("Placeholder Text")
QLineEdit
的另一个有用功能是可以将其内容设置为只读。此属性用于以下小部件组控制对行编辑器的访问。
accessGroup = QGroupBox(tr("Access")) accessLabel = QLabel(tr("Read-only:")) accessComboBox = QComboBox() accessComboBox.addItem(tr("False")) accessComboBox.addItem(tr("True")) accessLineEdit = QLineEdit() accessLineEdit.setPlaceholderText("Placeholder Text")
现在所有子小部件都已经构建,我们将组合框的信号连接到 Window
对象的槽。
echoComboBox.activated.connect( self.echoChanged) validatorComboBox.activated.connect( self.validatorChanged) alignmentComboBox.activated.connect( self.alignmentChanged) inputMaskComboBox.activated.connect( self.inputMaskChanged) accessComboBox.activated.connect( self.accessChanged)
每个连接都使用 activated
信号向槽提供一个整数。这将在每个槽中有效地对适当的行编辑器进行更改。
我们将每个组合框、行编辑和标签放入每个组框的布局中,从 echoGroup
组框的布局开始。
echoLayout = QGridLayout() echoLayout.addWidget(echoLabel, 0, 0) echoLayout.addWidget(echoComboBox, 0, 1) echoLayout.addWidget(echoLineEdit, 1, 0, 1, 2) echoGroup.setLayout(echoLayout)
其他布局以相同的方式构建。
validatorLayout = QGridLayout() validatorLayout.addWidget(validatorLabel, 0, 0) validatorLayout.addWidget(validatorComboBox, 0, 1) validatorLayout.addWidget(validatorLineEdit, 1, 0, 1, 2) validatorGroup.setLayout(validatorLayout) alignmentLayout = QGridLayout() alignmentLayout.addWidget(alignmentLabel, 0, 0) alignmentLayout.addWidget(alignmentComboBox, 0, 1) alignmentLayout.addWidget(alignmentLineEdit, 1, 0, 1, 2) alignmentGroup. setLayout(alignmentLayout) inputMaskLayout = QGridLayout() inputMaskLayout.addWidget(inputMaskLabel, 0, 0) inputMaskLayout.addWidget(inputMaskComboBox, 0, 1) inputMaskLayout.addWidget(inputMaskLineEdit, 1, 0, 1, 2) inputMaskGroup.setLayout(inputMaskLayout) accessLayout = QGridLayout() accessLayout.addWidget(accessLabel, 0, 0) accessLayout.addWidget(accessComboBox, 0, 1) accessLayout.addWidget(accessLineEdit, 1, 0, 1, 2) accessGroup.setLayout(accessLayout)
最后,我们将每个组框放入 Window
对象的网格布局中,并设置窗口标题。
layout = QGridLayout() layout.addWidget(echoGroup, 0, 0) layout.addWidget(validatorGroup, 1, 0) layout.addWidget(alignmentGroup, 2, 0) layout.addWidget(inputMaskGroup, 0, 1) layout.addWidget(accessGroup, 1, 1) setLayout(layout) setWindowTitle(tr("Line Edits"))
插槽对用户更改组合框时发出的信号做出响应。
当 Echo 组框的组合框被更改时,会调用 echoChanged
槽。
def echoChanged(self, index): if index == 0: echoLineEdit.setEchoMode(QLineEdit.Normal) break elif index == 1: echoLineEdit.setEchoMode(QLineEdit.Password) break elif index == 2: echoLineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit) break elif index == 3: echoLineEdit.setEchoMode(QLineEdit.NoEcho) break
该槽会更新同一组框中的行编辑,以使用与组合框中条目相对应的回显模式。
当 Validator 组框的组合框被更改时,会调用 validatorChanged
槽。
def validatorChanged(self, index): if index == 0: validatorLineEdit.setValidator(None) break elif index == 1: validatorLineEdit.setValidator(QIntValidator( validatorLineEdit)) break elif index == 2: validatorLineEdit.setValidator(QDoubleValidator(-999.0, 999.0, 2, validatorLineEdit)) break validatorLineEdit.clear()
该槽创建一个新的验证器以便行编辑使用,或者通过调用 setValidator
并传入一个空指针来移除正在使用的验证器。在这种情况下,我们清除行编辑以确保新验证器最初可以得到有效输入进行操作。
当 Alignment 组框的组合框被更改时,会调用 alignmentChanged
槽。
def alignmentChanged(self, index): if index == 0: alignmentLineEdit.setAlignment(Qt.AlignLeft) break elif index == 1: alignmentLineEdit.setAlignment(Qt.AlignCenter) break elif index == 2: alignmentLineEdit.setAlignment(Qt.AlignRight) break
这会将行编辑器中显示文本的方式更改为与在组合框中选择的描述相对应。
inputMaskChanged
槽处理 Input Mask 组框中组合框的变化。
def inputMaskChanged(self, index): if index == 0: inputMaskLineEdit.setInputMask("") break elif index == 1: inputMaskLineEdit.setInputMask("+99 99 99 99 99;_") break elif index == 2: inputMaskLineEdit.setInputMask("0000-00-00") inputMaskLineEdit.setText("00000000") inputMaskLineEdit.setCursorPosition(0) break elif index == 3: inputMaskLineEdit.setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#") break
相关的组合框中的每个条目都与一个输入掩码相关联。我们通过调用 setInputMask
函数并传入一个合适的字符串来设置新的掩码;如果使用空字符串,掩码将被禁用。
accessChanged
槽处理 Access 组框中组合框的变化。
def accessChanged(self, index): if index == 0: accessLineEdit.setReadOnly(False) break elif index == 1: accessLineEdit.setReadOnly(True) break
在此,我们将组合框中的“False”和“True”条目简单地与 false
和 true
值关联,这些值将被传递给 setReadOnly()
方法。这允许用户启用和禁用对行编辑的输入。