有人知道如果一个孩子在选择了相应的父母后被禁用,他们将如何禁用这个孩子,反之亦然。请考虑以下示例:
A-1 -2
其中A是树视图中的父节点,1和2是该父节点下的两个子节点。如果用户选择A他/她不应该选择1或2.以同样的方式,如果用户选择1或2,他/她应该不能选择A.
这是我用过的代码。该类定义了TreeView模型:
class TreeModel(QtCore.QAbstractItemModel):
'''
This class handles the treeview model.
'''
def __init__(self, top, *args, **kwargs):
super(TreeModel, self).__init__(*args, **kwargs)
self.__top = top
def index(self, row, column, parent=QtCore.QModelIndex()):
if parent.isValid():
parent_node = parent.internalPointer()
node = parent_node.children[row]
index = self.createIndex(row, column, node)
else:
index = self.createIndex(row, column, self.__top)
return index
def parent(self, index):
if index.isValid():
node = index.internalPointer()
parent = node.parent
if parent is None:
parent_index = QtCore.QModelIndex()
else:
parent_index = self.createIndex(parent.row(), 0, parent)
else:
parent_index = QtCore.QModelIndex()
return parent_index
def rowCount(self, index=QtCore.QModelIndex()):
node = index.internalPointer()
if node is None:
count = 1
else:
count = len(node.children)
return count
def columnCount(self, index=QtCore.QModelIndex()):
return 1
def data(self, index, role=QtCore.Qt.DisplayRole):
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
node = index.internalPointer()
data = str(node.number)
else:
data = None
return data
def addChild(self, index, child):
self.beginInsertRows(index, self.rowCount(index), self.rowCount(index) + 1)
parent = index.internalPointer()
parent.addChild(child)
self.endInsertRows()
self.layoutChanged.emit()
此功能根据用户输入将节点添加到树中:
for key, value in treeViewModelDict.items():
temp = [key, value]
treeViewDictList.append(temp)
print(self.treedict)
def recurse(parent, children_data):
for child_data in children_data:
if isinstance(child_data, list):
recurse(child, child_data)
else:
child = MyData(child_data, parent=parent)
top = MyData("Tree View of Selected Meters")
for i, next in enumerate(treeViewDictList):
recurse(top, next)
self.model = TreeModel(top)
self.treeView.setModel(self.model)
self.treeView.expandAll()
有没有这样做的pythonic方式?
答案 0 :(得分:0)
您需要记录当前选择的内容。我通常将它存储在某个模型中。树视图选择模型上的selectionChanged
信号对此有好处。
然后给你的模型一个标志方法(它应该已经存在),它检查当前节点的父节点是否被选中,如果不是,那么你返回你想要或用Qt.ItemIsSelectable
标记的任何标志,如果是,则返回没有Qt.ItemIsSelectable