QAbstractItemModel自动设置检查状态

问题描述:

我试图自动检查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 

但是相关节点的复选框没有得到检查。有任何想法吗?

该复选框正在被检查,但只有当鼠标移动到悬停在相关节点上。根据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