【问题标题】:PyQt QTreeView Disable child selection when parent selectedPyQt QTreeView 选择父项时禁用子项选择
【发布时间】:2015-08-16 10:16:59
【问题描述】:

有谁知道一旦其对应的父级已被选中,如何禁止子级被选中,反之亦然。考虑以下示例:

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的方式来做到这一点?

【问题讨论】:

  • 请发布您的模型和节点类的代码。
  • @TimWakeham 请看上面的编辑帖子

标签: python-3.x pyqt4


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2015-02-17
    相关资源
    最近更新 更多