QComboBox可编辑且使用模型时不发出信号

2 投票
1 回答
700 浏览
提问于 2025-04-18 00:35

我正在尝试捕捉QComboBox中的高亮信号,但这个信号并不是一直都能正常发出。到目前为止,我发现了以下几点:

  1. 如果QComboBox是不可编辑的,那么高亮信号会正常发出。
  2. 如果QComboBox是可编辑的,并且使用的是默认的便利模型(也就是说,没有调用setModel),那么高亮信号也会正常发出。

    但是:

  3. 如果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通常需要断开并重新连接几个信号,可能还需要删除并重新创建一些子控件。所以一般来说,最好先设置好新的模型,再进行其他任何更改。并不是只有下拉框的高亮会受到影响,任何使用模型/视图框架的控件(比如列表控件、树形控件、表格控件等)都可能会有类似的情况。

很难准确预测重新设置模型后,控件的哪些部分会受到影响——你可能需要查看源代码才能确定。为了避免将来出现一些难以发现的错误,养成先设置模型再做其他更改的习惯是个好主意。

撰写回答