将一个QTreeWidgetItem父母到一个现有的QTreeWidgetItem到第二列,并保持第一列

时间:2019-06-20 16:21:36

标签: python pyside2

我创建了一个QTreeWidget并使用QTreeWidget.addTopLevelItem方法将QTreeWidgetItem作为父项。 QTreeWidgetItem与QTreeWidgetItem.addChild彼此父代。哪个很棒。但是,我想在每个QTreeWidgetItem旁边添加一个向左而非向右刷新的复选框(通过添加QtCore.Qt.ItemIsUserCheckable很容易)。我可以在第二列中添加一个复选框并维护该树。当我将复选框添加到第一列并将setText添加到secound列时,所有这些事情搞砸了。

如果我在QTreeWidgetItem中添加一个复选框,则会得到类似的内容:

[   ] red
    [   ] blue  
    [   ] green 
        [   ] orange 
            [    ] purple  
                 [   ] pink

我不要颜色旁边的复选框。我在寻找:

Col1 | Col2
[   ] red 
[   ]     blue 
[   ]     green 
[   ]         orange 
[   ]            purple 
[   ]                pink

我知道我需要在QtWidgets.QTreeWidgetItem中添加小部件,例如:

self.button = QtWidgets.QPushButton("L") # testing with a button
treeWidget = self.treeWidget()
treeWidget.setItemWidget(self, 0,self.button)

我在树上寻找的东西。 I am looking to make the tree like the following image. Nevermind the 3 columns, I am using 2

1 个答案:

答案 0 :(得分:1)

您可以将复选框设置为QTreeWidget中的第二列,并交换标题的第一部分和第二部分,例如

from PySide2 import QtWidgets, QtCore

class MyItem(QtWidgets.QTreeWidgetItem):
    def __init__(self, label):
        super().__init__([label, ''])
        self.setCheckState(1, QtCore.Qt.Unchecked)
        self.setFlags(self.flags() | QtCore.Qt.ItemIsAutoTristate)

class MyTree(QtWidgets.QTreeWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setColumnCount(2)
        self.header().swapSections(1,0)
        self.header().resizeSection(1, 80)

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    tree = MyTree()
    tree.setHeaderLabels(['label', 'checked'])
    items = [MyItem(f'item {i}') for i in range(6)]
    tree.insertTopLevelItems(0, items)
    for i, item in enumerate(items):
        for j in range(4):
            items[i].addChild(MyItem(f'item {i}-{j}'))
    tree.show()
    app.exec_()

请注意,我还设置了QtCore.Qt.ItemIsAutoTristate,以在项的选中状态更改时自动更新其父/子项的选中状态。 screenshot of tree with checkboxes on the left

相关问题