ahe*_*ahe 5 c++ qt qtableview qlistview
我有一个使用 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);
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到执行绘图的实际代码。似乎 Qt5 附带的所有样式最终都会将 ItemView 元素的绘制委托给该代码。有趣的是,相关代码实际上在选择的顶部绘制了图标,因此您必须使用某种自定义样式。绘制选择的调用是:
proxy()->drawPrimitive(PE_PanelItemViewItem, opt, p, widget);
Run Code Online (Sandbox Code Playgroud)
该调用先于所有其他绘图调用进行。
在您的自定义委托中,您应该能够通过修改来要求样式绘制除图标之外的所有内容QStyleOptionViewItem opt(请参阅第一个代码片段)。然后你可以手动绘制你的图标,方法相同QCommonStyle。