我试图捕捉来自QComboBox的突出显示的信号,但它没有被一致地发射。到目前为止,我发现了:
如果QComboBox是可编辑的并且使用默认的便利模型(即没有调用setModel),则会发出突出显示的信号。
BUT:
这种行为有原因吗?我错过了什么吗?
下面是一个代码示例,其中组合1-3说明了上面列出的3个案例,而combo3没有发出突出显示的信号,而组合1和2则是。
谢谢!
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),似乎突出显示的信号正确发出。即,交换命令或“组合3”的第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)))
对于我眼前的问题,这是一个解决方法,但我仍然觉得这很令人费解,所以任何有关正在发生的事情的见解都会受到赞赏......
答案 0 :(得分:1)
无论何时设置新模型,Qt通常都必须断开并重新连接多个信号,并且还可能删除并重新创建一些子控件。所以一般来说,在进行任何其他更改之前,最好先设置新模型 。它不仅仅是在一个可以以这种方式受到影响的组合框中突出显示 - 任何使用模型/视图框架的小部件(例如list-widgets,tree-widgets,table-widgets等)都可以以相同的方式运行。
很难通过重新设置模型来准确预测窗口小部件的哪些元素会受到影响 - 您可能必须研究源代码才能确定。因此,为了避免细微的错误,只需养成在其他任何事情之前设置模型的习惯。