gpt4 book ai didi

c++ - 如何防止 Qt 对 QListView 中的图标进行 alpha 混合选择?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:55 24 4
gpt4 key购买 nike

我有一个使用 QTableView 和 QListView 的 Qt 应用程序。在这两个 witdgets 中,我都显示了一些图标。

问题是,当用户选择其中一个条目时,Qt alpha 将选择混合在图标上,使图标看起来对比度较低,颜色略有不同。

我希望 Qt 先绘制选区,然后在顶部绘制图标,这样无论是否选中,它们看起来都一样。我该怎么做?

更新:

这就是我的问题:

Effect with a normal icon

白色矩形图标更容易识别:

Effect with a white rectangle icon

当您使用图形编辑器检查颜色值时,您会看到颜色值发生了变化。我希望 Qt 在没有这个覆盖层的情况下按原样绘制图标。

这里的 QListView 是用颜色渐变背景设计的。但是我对没有样式的 QTableView 也有同样的问题。

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

最佳答案

ItemView 元素的绘制由委托(delegate)处理。您可以为列、行或单个项目设置自定义委托(delegate)。默认实现只是将绘图委托(delegate)给小部件的样式:

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 元素的绘制委托(delegate)给该代码。有趣的是,有问题的代码实际上是在选择的顶部绘制图标,因此您必须使用一些自定义样式。绘制选择的调用是:

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

该调用先于所有其他绘图调用。

在您的自定义委托(delegate)中,您应该能够通过修改 QStyleOptionViewItem opt(请参阅第一个代码片段)要求样式绘制除图标之外的所有内容。然后您可以手动绘制图标,方法与 QCommonStyle 相同。

关于c++ - 如何防止 Qt 对 QListView 中的图标进行 alpha 混合选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com