【问题标题】:QComboBox not emitting signal when it's editable and using a modelQComboBox 在可编辑和使用模型时不发出信号
【发布时间】:2014-05-10 01:55:29
【问题描述】:

我正在尝试从 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)))

这是解决我眼前问题的一种解决方法,但我仍然觉得这很令人费解,所以任何关于正在发生的事情的见解将不胜感激......

【问题讨论】:

  • 您是否检查过您的模型是否为项目返回了正确的 flags()?它是否将项目返回为“可选”?
  • @user3427419:我最初没有。但他们是;事实上,我使用的是标准 Qt 模型,这里没有自定义模型。

标签: python qt pyqt signals-slots qcombobox


【解决方案1】:

每当您设置一个新模型时,Qt 经常需要断开和重新连接多个信号,并且可能还需要删除和重新创建一些子控件。所以一般来说,在进行任何其他更改之前首先设置新模型总是明智的。不只是在组合框中突出显示会以这种方式受到影响——任何使用模型/视图框架的小部件(例如列表小部件、树小部件、表格小部件等)都可以以相同的方式运行。

很难准确预测小部件的哪些元素会受到重新设置模型的影响——您可能必须研究源代码才能确定。因此,为避免后续出现细微的错误,请养成先设置模型的习惯。

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多