python - QComboBox 在可编辑和使用模型时不发出信号

标签 python qt pyqt signals-slots qcombobox

我正在尝试从 QComboBox 捕获突出显示的信号,但它并没有始终如一地发出。到目前为止,我发现:

  1. 如果 QComboBox 不可编辑,则正确发出突出显示的信号。
  2. 如果 QComboBox 是可编辑的并且使用默认的便捷模型(即没有调用 setModel),则发出突出显示的信号。

    但是:

  3. 如果 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/

相关文章:

python - 循环删除 QListWidget 中的所有项目

python - 在 matplotlib 中使用标记绘制序数数据

python - 使用pygame渲染unicode字体

c++ - 与 Qthreads 链接错误

python - 两个 QListView 框,一个显示文件夹中的文件,一个显示第一个 QListview 中选定的文件

python - QFileSystemModel 禁用 QFileIconProvider

python - 通过 Python 打开新的 bash 选项卡窗口

python - 如何解释多类分类的输出?

qt - 如何在 Windows 和 MSVC 2015 上构建 Qt 5.5 QtWebEngine

qt - 将 QWidget 添加到 QListWidget