【问题标题】:Qt view to display data columns vertically in pairsQt视图成对垂直显示数据列
【发布时间】:2021-11-29 00:49:21
【问题描述】:

我目前正在考虑通过 Python 中的 PySide6 使用 Qt 进行模型/视图编程。我正在寻找一个支持成对显示数据行的列数据垂直的视图(为简化起见,我在这里只假设 2 列,A 和 B)。为了说明这一点,在 QTableView 中,数据将像这样显示(对于 A 列和 B 列):

A B
甲乙
…

虽然我希望它显示如下:

一个
乙

一个
乙

…

有人可以为我指出实现这一目标的良好起点吗?我最初尝试使用 QDataWidgetMapper 为 QScrollArea 中的小部件显示数据,但这感觉不是正确的方法。

【问题讨论】:

  • 看看QTreeView,你会在不同的分支下显示每一列。
  • 谢谢!出于某种原因,我一开始就排除了 QTreeView,但现在再看一遍,将它用于这种显示是完全有道理的。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python qt model-view pyside6


【解决方案1】:

这是我根据 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__':
    app = QApplication(sys.argv)
    main_win = MainWindow()
    main_win.show()
    sys.exit(app.exec())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多