2014-01-17 5 views
5

다중 선택 QComboBox을 만들었습니다. 항목을 체크 할 수 있습니다 (모든 항목에는 확인란과 텍스트 값이 있습니다). CheckBox는 사용자가 클릭 할 때만 선택됩니다. 내가 원하는 것은 사용자가 텍스트 값을 클릭 할 때 신호를 잡아서 옆에있는 확인란을 선택할 수 있도록하는 것입니다. 그렇게하는 방법?qComboBox 팝업 메뉴에서 마우스 버튼을 누를 때

내가 휠 이벤트를 차단하기 위해 이벤트 필터를 추가 한

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의 텍스트는 항상 "선택"으로 표시됩니다 :

enter image description here

내가 콤보 상자에 모델을 설정하는 방법입니다
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를 수정하고 주 응용 프로그램에 설치하면 모든 단일 이벤트가 실행되는 것을 볼 수 있습니다. 콤보 상자와 상호 작용할 때 전혀 이벤트가 전송되지 않습니다./ – 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. 대신 'pressed'신호를 사용하십시오 (내 대답을 업데이트했습니다). – ekhumoro

+0

그게 .. QtCore.Qt.ItemIsUserCheckable 플래그도 제거 했으므로 사용자가 직접 체크 상자를 클릭하면'handleItemPressed' 만 확인란의 상태를 변경합니다. 또한'handleItemPressed'에'if not index.row() == 0 :'를 추가하여 사용자가'firstItem'을 체크하지 못하게하고, 이제는 원하는대로 모든 것이 작동합니다 – Aleksandar

관련 문제