2015-11-07 83 views
1

我試圖自動檢查QTreeView中的節點(例如,當用戶加載一些數據時)。手動複選框滴答功能工作正常。我搜索了樹的相關項目按http://rowinggolfer.blogspot.com.au/2010/05/qtreeview-and-qabractitemmodel-example.html即:QAbstractItemModel自動設置檢查狀態

在模型:

def searchModel(self, person): 
    def searchNode(node): 
     for child in node.childItems: 
      if person == child.person: 
       index = self.createIndex(child.row(), 0, child) 
       return index 

      if child.childCount() > 0: 
       result = searchNode(child) 
       if result: 
        return result 

    node_index = searchNode(self.parents[0]) 
    return node_index 

def find_GivenName(self, fname): 
    app = None 
    for person in self.people: 
     if person.fname == fname: 
      app = person 
      break 
    if app != None: 
     index = self.searchModel(app) 
     return (True, index)    
    return (False, None) 

然後我通過相關節點在模型中設置其檢查狀態如

model.setData(node_index, 2, QtCore.Qt.CheckStateRole) 

在型號中:

def setData(self, index, value, role): 
    if role == Qt.CheckStateRole: 
     row = index.row() 
     self.args[row].checked = value    
    return True 

但是相關節點的複選框沒有得到檢查。有任何想法嗎?

回答

0

該複選框正在被檢查,但只有當鼠標移動到懸停在相關節點上。根據pyqt文檔 - '重新實現setData()函數時,dataChanged()信號必須明確發出'http://pyqt.sourceforge.net/Docs/PyQt4/qabstractitemmodel.html#dataChanged。我在模型改變爲SetData方法:

def setData(self, index, value, role): 
    if role == Qt.CheckStateRole: 
     row = index.row() 
     self.args[row].checked = value 
     self.dataChanged.emit(index, index) 
return True 

還有這裏的dataChanged()信號的一些有用的信息:When to emit dataChanged from a QAbstractItemModel