QAbstractItemModel 自动设置检查状态
QAbstractItemModel set check state automatically
我正在尝试自动检查 QTreeView 中的节点(例如,当用户加载某些数据时)。手动复选框勾选功能工作正常。我根据 http://rowinggolfer.blogspot.com.au/2010/05/qtreeview-and-qabractitemmodel-example.html 在树中搜索相关项目,即:
模型中:
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)
然后我将相关节点传入模型来设置它的检查状态eg
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 文档 - 'when reimplementing the setData() function, the dataChanged() signal must be emitted explicitly' 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
我正在尝试自动检查 QTreeView 中的节点(例如,当用户加载某些数据时)。手动复选框勾选功能工作正常。我根据 http://rowinggolfer.blogspot.com.au/2010/05/qtreeview-and-qabractitemmodel-example.html 在树中搜索相关项目,即:
模型中:
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)
然后我将相关节点传入模型来设置它的检查状态eg
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 文档 - 'when reimplementing the setData() function, the dataChanged() signal must be emitted explicitly' 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