2014-03-30 44 views
2

我試圖從QComboBox中捕捉突出顯示的信號,但它並不一致地發出。到目前爲止,我已經發現:QComboBox在可編輯和使用模型時不發出信號

  1. 如果QComboBox不可編輯,突出顯示的信號會正確發射。
  2. 如果QComboBox是可編輯的並且使用默認的便利模型(即,未對setModel進行調用),則會突出顯示信號。

    BUT:

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

這是我迫切關注的一個解決辦法,但我還是覺得這很令人費解,所以任何對正在發生的事情是見解讚賞...

+0

你是否檢查過你的模型返回正確的標誌()的項目?它是否將項目返回爲「可選」? – user3427419

+0

@ user3427419:我最初沒有。但他們是;實際上我使用的是標準Qt模型,這裏沒有自定義模型。 – fstafforini

回答

1

每當你設置一個新的模型,Qt經常必須斷開和重新連接幾個信號,並可能刪除並重新創建一些子控制。因此,一般來說,在進行任何其他更改之前,先設置新型號首先是總是明智之舉。這不僅僅是在組合框中突出顯示,可以通過這種方式受到影響 - 任何使用模型/視圖框架的小部件(例如列表小部件,樹部件,表部件等)都可以採取相同的行爲。

很難通過重新設置模型來準確預測小部件的哪些元素會受到影響 - 您可能必須研究源代碼才能確定。所以爲了避免細微的錯誤,只要養成在其他任何事情之前設置模型的習慣。

相關問題