2010-04-15 51 views
1

我一直在嘗試了幾天,找出爲什麼我的QAbstractLisModel不會允許用戶切換三種狀態的可檢查項目。該模型返回flags()方法中的Qt.IsTristateQt.ItemIsUserCheckable,但是當程序運行時,僅在編輯時切換Qt.Checked和Qt.Unchecked。PyQt QAbstractListModel似乎忽略三態標誌

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_() 

,看到只有2個狀態是可用的。我假設我錯過了一些簡單的東西。有任何想法嗎?謝謝!

回答

0

您可能需要在clicked()信號上創建一個自定義插槽,以循環三種狀態。通常,三態元素只能直接點擊和關閉,並且只有在子元素處於不同狀態時才處於部分檢查模式。