c – 如何防止Qt在QListView中对图标进行alpha混合?

我有一个使用QTableView和QListView的Qt应用程序.在两个witdgets我显示一些图标.

问题在于,当用户选择其中一个条目时,Qt alpha将选择与图标混合,使得图标以较低的对比度和略微不同的颜色显示.

我希望Qt首先绘制选择,然后在顶部绘制图标,这样无论它们是否被选中,它们看起来都是一样的.我怎样才能做到这一点?

更新:

这就是我的问题:

《c – 如何防止Qt在QListView中对图标进行alpha混合?》

使用白色矩形图标更容易找到:

《c – 如何防止Qt在QListView中对图标进行alpha混合?》

使用图形编辑器检查颜色值时,您会看到颜色值发生变化.我希望Qt在不使用此叠加层的情况下绘制图标.

这里的QListView采用颜色渐变背景设计.但我对QTableView也有同样的问题,这个问题没有问题.

顺便说一句,所有图标都是SVG.

最佳答案 ItemView元素的绘制由委托处理.您可以为列,行或单个项设置自定义委托.默认实现只是将绘图委托给窗口小部件的样式:

void QStyledItemDelegate::paint(QPainter *painter,
    const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    QStyleOptionViewItem opt = option;
    initStyleOption(&opt, index);

    const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
    QStyle *style = widget ? widget->style() : QApplication::style();
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
}

您可以找到执行绘图here的实际代码.似乎Qt5附带的所有样式最终都将ItemView元素的绘图委托给该代码.有趣的是,有问题的代码实际上在选择的顶部绘制了图标,因此您必须使用一些自定义样式.绘制选择的调用是:

proxy()->drawPrimitive(PE_PanelItemViewItem, opt, p, widget);

该调用在所有其他绘图调用之前进行.

在您的自定义委托中,您应该能够通过修改QStyleOptionViewItem opt来请求样式绘制除图标之外的所有内容(请参阅第一个代码段).然后你可以手动绘制图标,就像QCommonStyle一样.

点赞