当 QComboBox 设置为可编辑时

When QComboBox is set editable

下面的代码创建了 QComboBox 和 QPushButton,它们都分配给了相同的布局。组合框设置为可编辑,因此用户可以键入新的组合框项的值。 如果用户点击 Tab 键盘键(而不是 Enter),新值将不会添加到 ComboBox。 问题:即使用户使用 Tab 键离开 ComboBox,如何确保 ComboBox 的项目更新为新值?

from PyQt4 import QtGui

def comboActivated(arg=None):
    print '\n ...comboActivated: %s'%arg

widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
widget.setLayout(layout)
combo = QtGui.QComboBox()
combo.setEditable(True)
combo.addItems(['One','Two','Three'])
combo.activated.connect(comboActivated)
layout.addWidget(combo)
layout.addWidget(QtGui.QPushButton('Push'))
widget.show()

当用户编辑框中的文本时,editTextChanged() 信号以编辑后的文本作为参数发出。此外,当小部件本身失去焦点时,例如当用户键入 Tab 以移动到按钮时,小部件会发出 focusOutEvent() 信号。此信号的参数是 QFocusEvent,您可以查询失去焦点的原因。事件的 reason() 方法将 return Qt.TabFocusReason,例如,如果用户点击 Tab 按钮离开小部件。

您可以将插槽连接到这些信号中的一个(或两个),这样当用户在编辑文本后离开小部件时,您可以对其进行处理并将其添加到框的值列表中。

您可能还想查看 QValidator class 及其子 class,您将它们附加到具有可编辑文本的小部件,并定义有效输入的类型小部件(例如,整数、文本等)。这是验证用户对可编辑小部件的输入的最好和最简单的方法。