Поймать сигнал нажатой кнопки мыши из всплывающего меню qComboBox

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

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

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текст всегда отображается как "выбранный"

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

1 ответ

Решение

Вам нужно подключить обработчик к нажатому сигналу вида комбо:

    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)
Другие вопросы по тегам