我创建了一个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)
答案 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
,以在项的选中状态更改时自动更新其父/子项的选中状态。