我正在尝试从 QComboBox 捕获突出显示的信号,但它并没有始终如一地发出。到目前为止,我发现:
- 如果 QComboBox 不可编辑,则正确发出突出显示的信号。
如果 QComboBox 是可编辑的并且使用默认的便捷模型(即没有调用 setModel),则发出突出显示的信号。
但是:
- 如果 QComboBox 是可编辑的并且它使用的模型不是默认的便利模型,则不会发出突出显示的信号。我已经使用标准 QStringList 模型和自定义模型对此进行了尝试。
这种行为有原因吗?我错过了什么吗?
下面是一个代码示例,其中组合 1-3 说明了上述 3 种情况,并且组合 1 和组合 2 发出时,组合 3 未发出突出显示的信号。
谢谢!
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
class TestWindow(QtGui.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
data_items = ['item1', 'item2', 'item3', 'item4']
combo1 = QtGui.QComboBox(self)
combo1.setEditable(False)
combo1.setModel(QtGui.QStringListModel(data_items, self))
combo1.highlighted.connect(lambda i: messages.append('combo1 emits highlighted signal, item={}'.format(i)))
combo2 = QtGui.QComboBox(self)
combo2.setEditable(True)
combo2.addItems(data_items)
combo2.highlighted.connect(lambda i: messages.append('combo2 emits highlighted signal, item={}'.format(i)))
combo3 = QtGui.QComboBox(self)
combo3.setEditable(True)
combo3.setModel(QtGui.QStringListModel(data_items, self))
combo3.highlighted.connect(lambda i: messages.append('combo3 emits highlighted signal, item={}'.format(i)))
messages = QtGui.QTextEdit(self)
layout = QtGui.QVBoxLayout()
layout.addWidget(combo1)
layout.addWidget(combo2)
layout.addWidget(combo3)
layout.addWidget(messages)
self.setLayout(layout)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = TestWindow()
window.show()
app.exec_()
编辑: 似乎如果我在调用 setModel 后调用 setEditable(True),则会正确发出突出显示的信号。即,像这样交换“combo3”调用的顺序或第 2 行和第 3 行:
combo3 = QtGui.QComboBox(self)
combo3.setModel(QtGui.QStringListModel(data_items, self))
combo3.setEditable(True)
combo3.highlighted.connect(lambda i: messages.append('combo3 emits highlighted signal, item={}'.format(i)))
这是解决我眼前问题的一个解决方法,但我仍然觉得这很令人费解,所以任何关于正在发生的事情的见解都将不胜感激......
最佳答案
每当您设置一个新模型时,Qt 通常必须断开并重新连接多个信号,并且可能还删除并重新创建一些子控件。所以一般来说,在进行任何其他更改之前首先设置新模型总是明智的。不仅仅是组合框中的突出显示会受到这种影响——任何使用模型/ View 框架的小部件(例如列表小部件、树小部件、表格小部件等)都可以以相同的方式运行。
很难准确预测小部件的哪些元素会因重新设置模型而受到影响 - 您可能必须研究源代码才能确定。因此,为避免出现细微错误,请养成先设置模型的习惯。
关于python - QComboBox 在可编辑和使用模型时不发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22749514/