PyQt QTreeView在父选择

时间:2015-08-07 12:20:32

标签: python-3.x pyqt4

有人知道如果一个孩子在选择了相应的父母后被禁用,他们将如何禁用这个孩子,反之亦然。请考虑以下示例:

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方式?

1 个答案:

答案 0 :(得分:0)

您需要记录当前选择的内容。我通常将它存储在某个模型中。树视图选择模型上的selectionChanged信号对此有好处。

然后给你的模型一个标志方法(它应该已经存在),它检查当前节点的父节点是否被选中,如果不是,那么你返回你想要或用Qt.ItemIsSelectable标记的任何标志,如果是,则返回没有Qt.ItemIsSelectable

的标志