在我的QListWidget
中,有些项目具有非默认背景颜色,我在自定义QListWidget
类中设置了它们:
item->setBackgroundColor(qcolor); // item is of type QListWidgetItem*
我设置的那些非默认颜色会被QListWidget
的选择颜色扭曲。查看示例:
项目three
和four
应该是相同的颜色,但它们不是因为项目four
被选中,因此结果颜色是原始颜色的总和QListWidget
的选择(活动项目?)颜色。
我的问题是如何编辑或删除该选择颜色?
我在QListWidget
内尝试(当我想要更改项目的背景颜色时,在特殊位置):
QPalette pal = this->palette();
pal.setColor(QPalette::Highlight, QColor(255,255,255,0));
this->setPalette(pal); // updated
但它没有产生任何影响。我究竟做错了什么?它是一个正确的变量吗?我是在QListWidget
内还是在其代表内部进行设置?
更新:我尝试使用评论/答案指出的样式表,但是,我的应用程序无法使用它们,因为我的行中的项目有3个状态(所以我会需要使用三种颜色)。例如,3种状态对应于三种颜色:粉红色表示活动,绿色表示不活动,灰色表示其余颜色。使用样式表时,我无法将自定义属性(让我们说QListWidget::item[Inactive="true"]
)设置为单个QListWidgetItem
,但是对于完整的QListWidget
,因此它会将所有行设置为相同的颜色。
针对类似问题here尝试了样式表,并且没有工作,因此我使用样式表做出结论是不可取的。
我最初使用的背景更改方法适用于我的目的,但我无法弄清楚如何摆脱默认选择颜色(透明浅蓝色),它会增加背景颜色并产生混合颜色。
答案 0 :(得分:3)
我认为使用样式表可以更好地完成这项工作。这是一个例子
QListWidget::item
{
background: rgb(255,255,255);
}
QListWidget::item:selected
{
background: rgb(128,128,255);
}
::item
表示 QListWidget 中的各个项目,而:selected
表示当前选中的 QListWidgetItems 。
要在特定小部件上获取自定义背景,您可以使用自定义样式表属性。在您的代码中,在要在其上应用自定义样式的小部件上调用类似的内容:
myList->setProperty( "Custom", "true" );
// Updates the style.
style->unpolish( myList );
style->polish( myList );
然后在样式表中,定义自定义属性的样式。
QListWidget::item[Custom="true"]
{
background: rgb(128,255,128);
}
答案 1 :(得分:2)
我通过使用委托找到了合适的解决方案。所以,没有必要使用QPalette
;对于我的问题,样式表将无法正常工作。当不同的行(QListWidget
或QTreeWidget
)需要以不同的颜色着色时,此解决方案也会起作用,具体取决于某些状态。
背景颜色的设置如问题所述:
item->setBackgroundColor(qcolor); // change color slot inside QListWidget class
为了定义小部件的绘制规则,我重新定义了委托:
class Delegate : public QStyledItemDelegate {};
然后我重新定义Delegate
方法paint()
。在那里,我定义了如何绘制我的小部件的每一行。更具体地说,我只在鼠标悬停在某个项目上时调用自定义绘图,或者该项目处于选定状态(这些是我想要避免的淡蓝色选择行的条件)。代码如下所示:
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if((option.state & QStyle::State_Selected) || (option.state & QStyle::State_MouseOver))
{
// get the color to paint with
QVariant var = index.model()->data(index, Qt::BackgroundRole);
// draw the row and its content
painter->fillRect(option.rect, var.value<QColor>());
painter->drawText(option.rect, index.model()->data(index, Qt::DisplayRole).toString());
}
else
QStyledItemDelegate::paint(painter, option, index);
// ...
}
当然,不要忘记将QListWidget
与Delegate
:
listWidget->setItemDelegate(new Delegate());