qtcss中的属性选择器

qtcss中的属性选择器,qt,Qt,我有一个用于用户/房间概念的树小部件。如何独立于房间中的用户设置房间的样式?我假设它与CSS中QT的属性选择器有关?我希望能够做到这一点: QTreeView::item[isUser="true"] { background: blue; } QTreeView::item[isRoom="true"] { background: red; } 由于模型中的项不是QObject(也不是QWidgets),因此您将无法向项添加属性,或使用样式表设置它们的样式 对于你想做的事,我有两个建议: 1

我有一个用于用户/房间概念的树小部件。如何独立于房间中的用户设置房间的样式?我假设它与CSS中QT的属性选择器有关?我希望能够做到这一点:

QTreeView::item[isUser="true"] { background: blue; }
QTreeView::item[isRoom="true"] { background: red; }

由于模型中的项不是QObject(也不是QWidgets),因此您将无法向项添加属性,或使用样式表设置它们的样式

对于你想做的事,我有两个建议:

1) (仅限C++)将您的
QTreeView
附加到
QStandardItemModel
,当您将项目添加为
QStandardItem
对象时,您可以使用
Qt::blue
Qt::red
调用
QStandardItem::setBackground()
,具体取决于项目是房间还是用户

2) (C++和CSS)定义一个附加到
QTreeView
QStyledItemDelegate
。在重新实现
QStyledItemDelegate::paint()
方法时,使用
QLabel
显示项的内容,然后在该
QLabel
上设置属性。然后,您将能够使用样式表自定义标签的外观:

QLabel[isUser="true"] { background: blue; }
QLabel[isRoom="true"] { background: red; }

通过创建一个标签,在标签上使用
setProperty
方法,然后使用
setItemWidget
函数将QLabel附加到适当的QTreeWidgetItem,我能够完成我所需要的。因此,我不会“设置QTreeWidgetItem的样式”,而是设置覆盖在QTreeWidgetItem顶部的QLabel的样式。以下示例将QTreeWidget中的my topLevelItem设置为可以设置为房间样式:

QTreeWidgetItem *topItem = ui->treeWidget->topLevelItem(0);
currentLabel = new QLabel;
currentLabel->setProperty("room",true);
currentLabel->setText(QString("Room Lobby"));
ui->treeWidget->setItemWidget(topItem,0,currentLabel);`
然后,我可以在样式表中使用

QLabel[room="true"] { background: red; }