2014-01-17 20 views
5

Я сделал мульти-выбор QComboBox. Элементы можно проверить (каждый элемент имеет флажок и текстовое значение). CheckBox проверяется только тогда, когда пользователь нажимает на него. Я хочу, чтобы поймать сигнал, когда пользователь нажимает на текстовое значение, поэтому я могу установить флажок рядом с ним. Как это сделать?Поймать кнопку мыши нажатой кнопкой из всплывающего меню qComboBox

enter image description here

Это, как я установил модель в поле со списком:

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) 

Я добавил фильтр событий блокировать событие колесика, так firstItem «s текст всегда отображается как„выбрано“

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

Редактирование eventFilter и установка в основное приложение для просмотра каждого отдельного события. Кажется, что не было никаких событий, отправленных вообще при взаимодействии с comboBox:/ – M4rtini

ответ

5

Вам необходимо подключить обработчик к pressed signal из комбо view:

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

Благодарим вас за ответ. Это работает (когда я нажимаю на текстовое значение: checkBox изменяется), но теперь я не могу проверить/снять флажок checkBox напрямую. Любая идея почему? – Aleksandar

+0

@Aleksandar. Вместо этого используйте «нажатый» сигнал (я обновил свой ответ). – ekhumoro

+0

Вот и все. Я также удалил флаг 'QtCore.Qt.ItemIsUserCheckable', поэтому, если вы нажмете прямо на флажок, только« handleItemPressed »изменит состояние флажка. Также я добавил 'if not index.row() == 0:' в 'handleItemPressed', чтобы отключить пользователя, чтобы проверить' firstItem', и теперь все работает так, как я хочу – Aleksandar

Смежные вопросы