2010-04-15 2 views
1

저는 QAbstractLisModel이 사용자가 세 가지 상태로 체크 가능한 항목을 토글하지 못하게하는 이유를 알아 내려고 며칠 동안 노력해 왔습니다. 이 모델은 flags() 메서드에서 Qt.IsTristateQt.ItemIsUserCheckable을 반환하지만 프로그램이 실행될 때 Qt.Checked 및 Qt.Unchecked 만 편집 중에 토글됩니다.PyQt QAbstractListModel이 3 상태 플래그를 무시하는 것 같습니다.

class cboxModel(QtCore.QAbstractListModel): 
    def __init__(self, parent=None): 
     super(cboxModel, self).__init__(parent) 
     self.cboxes = [ 
      ['a',0], 
      ['b',1], 
      ['c',2], 
      ['d',0] 
     ] 

    def rowCount(self,index=QtCore.QModelIndex()): 
     return len(self.cboxes) 

    def data(self,index,role): 
     if not index.isValid: return QtCore.QVariant() 
     myname,mystate = self.cboxes[index.row()] 
     if role == QtCore.Qt.DisplayRole: 
      return QtCore.QVariant(myname) 
     if role == QtCore.Qt.CheckStateRole: 
      if mystate == 0: 
       return QtCore.QVariant(QtCore.Qt.Unchecked) 
      elif mystate == 1: 
       return QtCore.QVariant(QtCore.Qt.PartiallyChecked) 
      elif mystate == 2: 
       return QtCore.QVariant(QtCore.Qt.Checked) 
     return QtCore.QVariant() 

    def setData(self,index,value,role=QtCore.Qt.EditRole): 
     if index.isValid(): 
      self.cboxes[index.row()][1] = value.toInt()[0]    
      self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), 
         index, index) 
      print self.cboxes 
      return True 
     return False 

    def flags(self,index): 
     if not index.isValid(): 
      return QtCore.Qt.ItemIsEditable 
     return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable |  QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsTristate 

당신이 함께

class MainForm(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     model = cboxModel(self) 

     self.view = QtGui.QListView() 
     self.view.setModel(model) 

     self.setCentralWidget(self.view) 


app = QtGui.QApplication(sys.argv) 
form = MainForm() 
form.show() 
app.exec_() 

을 테스트 만이 상태를 사용할 수 있는지 확인할 수 있습니다. 내가 잃어버린 뭔가 간단하다고 가정하고있어. 어떤 아이디어? 감사!

답변

0

세 가지 상태를 순환하는 clicked() 신호에 맞춤 슬롯을 만들어야 할 수 있습니다. 일반적으로 3 상태 요소는 직접 클릭하고 해제 할 수 있으며 하위 요소가 다른 상태에있는 경우에만 부분 검사 모드입니다. 이 알려진 문제처럼

관련 문제