我有一个QTreeView
来自我自己模型的项目(QAbstractItemModel
派生的)。现在我想为项目设置样式(在 上使用样式表QTreeView
),以便根据不同的属性,它们将具有不同的背景。
此外,这个问题似乎适用于任何模型/视图容器。不只是QTreeView
。
例如,做交替背景很容易。alternatingRowColors
就QTreeView
必须true
。然后在样式表中,您可以使用:alternate
伪选择器来更改备用项目的属性,以便:
QTreeView::item {
background: green;
}
QTreeView::item:alternate {
background: blue;
}
做选定的项目同样简单。事实上,做任何由 Qt 的伪选择器处理的事情都很容易。
但是那些不是伪选择器的属性呢?特别是如何根据关联的值选择样式ItemDataRole
(哪些接缝是在模型中存储数据的唯一合理通用的方法)?
请注意,有一个技巧。例如,如果您不使用检查状态,您可能会“重用”该状态以映射到您自己的东西,然后您有一个伪选择器......但这只是一种解决方法,甚至不是一般的解决方法。
QTreeWidget
似乎您可以通过为您想要添加的任何项目创建一个专用的派生类QWidget
。Q_PROPERTY
然后,您可以在样式表中按名称访问该属性。
例如,参见Qt Center 上的“使用带有样式表的自定义 Q_PROPERTY”问题和“使用动态属性时触发小部件的更新”。请注意 Qt 样式表示例的末尾。
但是这些*View
类的项目没有任何QWidget
s 甚至QObject
s (或者至少不是公共可访问的)。
也有可能提供自己的QAbstractItemDelegate
,可能是从QStyledItemDelegate
. 但这使得样式表交互变得更加困难。
有了像财产这样的简单员工,background-color
这似乎是可行的。但是,您将如何模拟以及复杂集合中的许多其他样式border-image
?padding
更不用说一旦你编写了一个项目委托,代码就会被冻结。如果Qt
更改呈现样式表的方式(以某种方式改进它),您将不会从中受益……这也会使逻辑/表示分离变得更加困难。现在你需要一个程序员来设置这些项目的样式,而不仅仅是一个支持 CSS 的图形专家......
那么有没有办法根据模型提供的属性/数据在样式表中进行子类化?