如何更改(删除)QListWidget的选择/活动颜色

时间:2016-03-15 17:21:16

标签: qt qt5 qlistwidget qpalette

在我的QListWidget中,有些项目具有非默认背景颜色,我在自定义QListWidget类中设置了它们:

item->setBackgroundColor(qcolor); // item is of type QListWidgetItem*

我设置的那些非默认颜色会被QListWidget的选择颜色扭曲。查看示例:

enter image description here

项目threefour应该是相同的颜色,但它们不是因为项目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尝试了样式表,并且没有工作,因此我使用样式表做出结论是不可取的。

我最初使用的背景更改方法适用于我的目的,但我无法弄清楚如何摆脱默认选择颜色(透明浅蓝色),它会增加背景颜色并产生混合颜色。

2 个答案:

答案 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;对于我的问题,样式表将无法正常工作。当不同的行(QListWidgetQTreeWidget)需要以不同的颜色着色时,此解决方案也会起作用,具体取决于某些状态。

背景颜色的设置如问题所述:

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);

    // ... 
}

当然,不要忘记将QListWidgetDelegate

相关联
listWidget->setItemDelegate(new Delegate());