【发布时间】:2014-05-10 01:55:29
【问题描述】:
我正在尝试从 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)))
这是解决我眼前问题的一种解决方法,但我仍然觉得这很令人费解,所以任何关于正在发生的事情的见解将不胜感激......
【问题讨论】:
-
您是否检查过您的模型是否为项目返回了正确的 flags()?它是否将项目返回为“可选”?
-
@user3427419:我最初没有。但他们是;事实上,我使用的是标准 Qt 模型,这里没有自定义模型。
标签: python qt pyqt signals-slots qcombobox