这是我根据Remarkod的建议想出来的,使用QTreeView。这在数据对之间留下了一些空间,但这对我来说很好。我想有可能以某种方式完全隐藏根项,而不是只让它们空着,无法选择。
import sys
from PySide6.QtGui import QStandardItem, QStandardItemModel, Qt
from PySide6.QtWidgets import QApplication, QMainWindow, QTreeView
class RootItem(QStandardItem):
def __init__(self):
super().__init__()
# Make root items unselectable
self.setEditable(False)
self.setFlags(Qt.NoItemFlags)
class ItemA(QStandardItem):
def __init__(self):
super().__init__()
self.setText("A")
class ItemB(QStandardItem):
def __init__(self):
super().__init__()
self.setText("B")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.treeModel = QStandardItemModel()
self.rootNode = self.treeModel.invisibleRootItem()
self.treeView = QTreeView()
self.treeView.setHeaderHidden(True)
self.treeView.setModel(self.treeModel)
rootItem_1 = RootItem()
item_a1 = ItemA()
item_b1 = ItemB()
rootItem_2 = RootItem()
item_a2 = ItemA()
item_b2 = ItemB()
rootItem_1.appendRow(item_a1)
rootItem_1.appendRow(item_b1)
self.rootNode.appendRow(rootItem_1)
rootItem_2.appendRow(item_a2)
rootItem_2.appendRow(item_b2)
self.rootNode.appendRow(rootItem_2)
# Expand all items, make them unexpandable, and hide decoration for root items
self.treeView.setItemsExpandable(False)
self.treeView.setRootIsDecorated(False)
self.treeView.expandAll()
self.setCentralWidget(self.treeView)
if __name__ == '__main__':