QComboBox可编辑且使用模型时不发出信号
我正在尝试捕捉QComboBox中的高亮信号,但这个信号并不是一直都能正常发出。到目前为止,我发现了以下几点:
- 如果QComboBox是不可编辑的,那么高亮信号会正常发出。
如果QComboBox是可编辑的,并且使用的是默认的便利模型(也就是说,没有调用setModel),那么高亮信号也会正常发出。
但是:
- 如果QComboBox是可编辑的,并且使用的是其他模型而不是默认的便利模型,那么高亮信号就不会发出。我尝试过使用标准的QStringList模型和自定义模型。
这种行为有什么原因吗?我是不是漏掉了什么?
下面有个代码示例,其中组合框1-3展示了上面提到的三种情况,而组合框3没有发出高亮信号,而组合框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),高亮信号就会正常发出。也就是说,把'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)))
这对我当前的问题是个解决办法,但我还是觉得这很让人困惑,所以如果有人能解释一下发生了什么,我会很感激……
1 个回答
1
每当你设置一个新的模型时,Qt通常需要断开并重新连接几个信号,可能还需要删除并重新创建一些子控件。所以一般来说,最好先设置好新的模型,再进行其他任何更改。并不是只有下拉框的高亮会受到影响,任何使用模型/视图框架的控件(比如列表控件、树形控件、表格控件等)都可能会有类似的情况。
很难准确预测重新设置模型后,控件的哪些部分会受到影响——你可能需要查看源代码才能确定。为了避免将来出现一些难以发现的错误,养成先设置模型再做其他更改的习惯是个好主意。