2014-01-17 15 views
5

Ich habe multi-select gemacht QComboBox. Elemente sind überprüfbar (jedes Element hat Kontrollkästchen und Textwert). CheckBox wird nur überprüft, wenn der Benutzer darauf klickt. Was ich will, ist, Signal zu fangen, wenn Benutzer auf Textwert klickt, also kann ich das Kontrolle-Kästchen neben es markieren lassen. Wie geht das?Fang Maustaste gedrückt Signal aus qKombiBox Popup-Menü

enter image description here

Dies ist, wie ich Modell Kombinationsfeld gesetzt:

areas = ["Area one", "Area two", "Area three", "Area four"] 
model = QtGui.QStandardItemModel(5, 1)# 5 rows, 1 col 

firstItem = QtGui.QStandardItem("---- Select area(s) ----") 
firstItem.setBackground(QtGui.QBrush(QtGui.QColor(200, 200, 200))) 
firstItem.setSelectable(False) 
model.setItem(0, 0, firstItem) 

for i,area in enumerate(areas): 
    item = QtGui.QStandardItem(area) 
    item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) 
    item.setData(QtCore.Qt.Unchecked, QtCore.Qt.CheckStateRole) 
    model.setItem(i+1, 0, item) 

self.ui.comboBox.setModel(model)   
self.ui.comboBox.installEventFilter(self) 

I Ereignisfilter hinzugefügt haben Rad-Ereignis zu blockieren, so firstItem ‚s Text wird als "gewählt" immer angezeigt

def eventFilter(self,target,event): 
    if target == self.ui.comboBox: 
     if(event.type()== QtCore.QEvent.Wheel): 
      #wheel event is blocked here 
      return True 
    return False 
+0

Indem Sie den eventFilter ändern und in der Hauptanwendung installieren, um jedes einzelne ausgelöste Ereignis zu sehen. Bei der Interaktion mit der ComboBox scheinen überhaupt keine Ereignisse gesendet zu werden:/ – M4rtini

Antwort

5

Sie benötigen view einen Handler zum pressed signal der Combo verbinden:

self.ui.comboBox.view().pressed.connect(self.handleItemPressed) 
    ... 

    def handleItemPressed(self, index): 
     item = self.ui.comboBox.model().itemFromIndex(index) 
     if item.checkState() == QtCore.Qt.Checked: 
      item.setCheckState(QtCore.Qt.Unchecked) 
     else: 
      item.setCheckState(QtCore.Qt.Checked) 
+0

Vielen Dank für Ihre Antwort. Das funktioniert (wenn ich auf den Text-Wert klicke: checkBox wird geändert), aber jetzt kann ich checkBox nicht direkt aktivieren/deaktivieren. Irgendeine Idee warum? – Aleksandar

+0

@Aleksandar. Verwenden Sie stattdessen das "gedrückte" Signal (ich habe meine Antwort aktualisiert). – ekhumoro

+0

das ist es .. Ich habe auch "QtCore.Qt.ItemIsUserCheckable" -Flag so entfernt, wenn Benutzer direkt auf das Kontrollkästchen klicken, wird nur 'handleItemPressed' Status des Kontrollkästchens ändern. Außerdem habe ich 'if not index.row() == 0:' in 'handleItemPressed' hinzugefügt, um den Benutzer zu deaktivieren, um 'firstItem' zu überprüfen, und jetzt funktioniert alles wie ich will – Aleksandar