在 QTreeView 中使用自定义角色而不是 DisplayRole

Posted

技术标签:

【中文标题】在 QTreeView 中使用自定义角色而不是 DisplayRole【英文标题】:Using custom role in QTreeView instead of DisplayRole 【发布时间】:2012-01-14 04:40:09 【问题描述】:

一个简单的问题,(希望有一个简单的答案)。

默认情况下,QTreeView 在获取显示行时会将 Qt.DisplayRole 传递给模型的数据函数。 但是假设我想传递 'MyAwesomeTreeDisplayRole' 而不是 Qt.DisplayRole,我需要做什么? 我似乎找不到任何关于视图决定在哪里使用 displayrole 或如何覆盖它的信息。

就在你问我为什么要做这么糟糕的事情之前......

基本上,我的 QAbstractItemModel 旨在用于树视图(1 列)和表格视图(多列,基于父级)。 对两种类型的视图使用相同的 DisplayRole 并没有真正起作用,因为那时我不得不为两种视图返回相同的数据。这导致当我想返回几列的串联时,我只能看到树视图中的第一列。

我认为最简单的方法是使用自定义角色(TreeDisplayRole 和 TableDisplayRole)。

提前致谢。

【问题讨论】:

【参考方案1】:

我不知道如何在python 中执行此操作,但您必须创建您的own delegate 才能呈现项目数据。委托实际上是一个对象,它从索引中请求任何数据并呈现它

注意,一般情况下QTreeView能够显示多列,您应该只为***索引正确设置columnCountin p>

【讨论】:

谢谢,我试试看。我知道 TreeView 可以显示多列,但它似乎只设置一个全局列数,所以我必须将它设置为我最宽的表的大小并制作一些填充样板来将空列添加到具有较少的节点类型列。此外,11 列对于树视图来说感觉有点尴尬。 :P【参考方案2】:

我使用 QTreeView 查看一个包含许多列的简单表格 - 它运行良好 - 您可以通过向其发送 columnCountChanged 信号来调整列数。所以我不确定你是否需要按照你的要求去做。

但我也使用过 ItemDelegate:使用 my_treeview.setItemDelegate() 将树视图指向您的项目委托。如果这个是 QStyledItemDelegate 的子类,那么它不需要做太多的工作——它几乎可以将它全部传递给 super。

然后,用户角色只是在您的自定义 ItemDelegate 和您的 ItemModel 之间达成一致,并且可以是您喜欢的任何角色,只要它们 >= 而不是 QtCore.Qt.UserRole。

(编辑:对不起,我把它作为一个新的答案,但这实际上只是对 Lol4t0 所说的内容的详细说明 - 除了 columnCountChanged 的​​事情)

【讨论】:

以上是关于在 QTreeView 中使用自定义角色而不是 DisplayRole的主要内容,如果未能解决你的问题,请参考以下文章

QTreeView、QTableView、不同层次层的显示项

如何向qtreeview 自定义model 添加新行

Qt - QTreeView 和带有复选框列的自定义模型

ASP.Net Core 2.1 注册自定义 ClaimsPrincipal

如何从 QStyle 获取 QTreeView 的标识宽度

如何获取 QTreeView 的大小/深度/分支?