在PyQt中隐藏QTreeView上的装饰器?

时间:2017-07-03 16:26:04

标签: python pyqt

我在SO上找到了这段代码:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.tree = QtGui.QTreeWidget(self)
        self.tree.setHeaderHidden(True)
        for index in range(2):
            parent = self.addItem(self.tree, 'Item%d' % index)
            for color in 'Red Green Blue'.split():
                subitem = self.addItem(parent, color)
                for letter in 'ABC':
                    self.addItem(subitem, letter, True, False)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.tree)
        self.tree.itemChanged.connect(self.handleItemChanged)

    def addItem(self, parent, text, checkable=False, expanded=True):
        item = QtGui.QTreeWidgetItem(parent, [text])
        if checkable:
            item.setCheckState(0, QtCore.Qt.Unchecked)
        else:
            item.setFlags(
                item.flags() & ~QtCore.Qt.ItemIsUserCheckable)
        item.setExpanded(expanded)
        return item

    def handleItemChanged(self, item, column):
        if item.flags() & QtCore.Qt.ItemIsUserCheckable:
            path = self.getTreePath(item)
            if item.checkState(0) == QtCore.Qt.Checked:
                print('%s: Checked' % path)
            else:
                print('%s: UnChecked' % path)

    def getTreePath(self, item):
        path = []
        while item is not None:
            path.append(str(item.text(0)))
            item = item.parent()
        return '/'.join(reversed(path))

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 250, 450)
    window.show() 

我想知道,我如何在所有项目中隐藏结果中的装饰器?

  • 我知道我可以用setstylesheet隐藏并没有实际删除箭头,只是隐藏它们,如果你不小心隐藏它们会适得其反。

  • item.setChildPolicy(QTreeWidgetItem.DontShowIndicator)要么删除子项,要么永久关闭它们,因为子项目(项目的子项)一旦我这样做就会消失,并且无法做任何事情......尝试过扩大,对我有用。

实际上在PyQt5中,答案并不需要在PyQt4中。

1 个答案:

答案 0 :(得分:1)

我从这里得到了一个潜在的解决方案:How do you disable expansion in QTreeWidget/QTreeView?

按照 eyllanesc 的建议,使用 setStyleSheet 来明显地隐藏箭头装饰器:

self.tree.setStyleSheet( "QTreeWidget::branch{border-image: url(none.png);}")

然后设置:

self.tree.setItemsExpandable(False)

您可以成功隐藏和禁用箭头装饰器。

就个人而言,我在使用 QPushButton 控制 QTreeWidgetItems 的扩展时使用了这种方法。

示例代码

def __init__(self):
    self.button = QtWidgets.QPushButton(text="toggle tree item")
    self.button.setCheckable = True
    self.button.toggled.connect(self.button_clicked)

def button_clicked(self, toggled):
    self.tree_widget_item.setExpanded(toggled)