2

我有一个QTreeView来自我自己模型的项目(QAbstractItemModel派生的)。现在我想为项目设置样式(在 上使用样式表QTreeView),以便根据不同的属性,它们将具有不同的背景。

此外,这个问题似乎适用于任何模型/视图容器。不只是QTreeView


例如,做交替背景很容易。alternatingRowColorsQTreeView必须true。然后在样式表中,您可以使用:alternate伪选择器来更改备用项目的属性,以便:

QTreeView::item {
  background: green;
}

QTreeView::item:alternate {
  background: blue;
}

做选定的项目同样简单。事实上,做任何由 Qt 的伪选择器处理的事情都很容易。

但是那些不是伪选择器的属性呢?特别是如何根据关联的值选择样式ItemDataRole(哪些接缝是在模型中存储数据的唯一合理通用的方法)?

请注意,有一个技巧。例如,如果您不使用检查状态,您可能会“重用”该状态以映射到您自己的东西,然后您有一个伪选择器......但这只是一种解决方法,甚至不是一般的解决方法。


QTreeWidget似乎您可以通过为您想要添加的任何项目创建一个专用的派生类QWidgetQ_PROPERTY然后,您可以在样式表中按名称访问该属性。

例如,参见Qt Center 上的“使用带有样式表的自定义 Q_PROPERTY”问题“使用动态属性时触发小部件的更新”。请注意 Qt 样式表示例的末尾

但是这些*View类的项目没有任何QWidgets 甚至QObjects (或者至少不是公共可访问的)。


也有可能提供自己的QAbstractItemDelegate,可能是从QStyledItemDelegate. 但这使得样式表交互变得更加困难。

有了像财产这样的简单员工,background-color这似乎是可行的。但是,您将如何模拟以及复杂集合中的许多其他样式border-imagepadding

更不用说一旦你编写了一个项目委托,代码就会被冻结。如果Qt更改呈现样式表的方式(以某种方式改进它),您将不会从中受益……这也会使逻辑/表示分离变得更加困难。现在你需要一个程序员来设置这些项目的样式,而不仅仅是一个支持 CSS 的图形专家......


那么有没有办法根据模型提供的属性/数据在样式表中进行子类化?

4

0 回答 0