我有一个使用QTableView和QListView的Qt应用程序.在两个witdgets我显示一些图标.
问题在于,当用户选择其中一个条目时,Qt alpha将选择与图标混合,使得图标以较低的对比度和略微不同的颜色显示.
我希望Qt首先绘制选择,然后在顶部绘制图标,这样无论它们是否被选中,它们看起来都是一样的.我怎样才能做到这一点?
更新:
这就是我的问题:
使用白色矩形图标更容易找到:
使用图形编辑器检查颜色值时,您会看到颜色值发生变化.我希望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一样.