我試圖從QComboBox中捕捉突出顯示的信號,但它並不一致地發出。到目前爲止,我已經發現:QComboBox在可編輯和使用模型時不發出信號
- 如果QComboBox不可編輯,突出顯示的信號會正確發射。
如果QComboBox是可編輯的並且使用默認的便利模型(即,未對setModel進行調用),則會突出顯示信號。
BUT:
- 如果QComboBox是可編輯的,它使用比默認方便模型之外的模型中,突出顯示的信號不被髮射。我已經嘗試過使用標準的QStringList模型和自定義模型。
是否有這種行爲的原因?我錯過了什麼嗎?
下面是一個代碼示例,其中組合1-3顯示了上面概述的3種情況,combo3在組合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(真)。即,交換了「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)))
這是我迫切關注的一個解決辦法,但我還是覺得這很令人費解,所以任何對正在發生的事情是見解讚賞...
你是否檢查過你的模型返回正確的標誌()的項目?它是否將項目返回爲「可選」? – user3427419
@ user3427419:我最初沒有。但他們是;實際上我使用的是標準Qt模型,這裏沒有自定義模型。 – fstafforini