如何更改 QListView 中项目的颜色

Posted

技术标签:

【中文标题】如何更改 QListView 中项目的颜色【英文标题】:How to change color of item in QListView 【发布时间】:2014-07-29 11:20:41 【问题描述】:

我有自己的 QListView 子类,我想更改索引为 mLastIndex 的项目的颜色。我试过了

QModelIndex vIndex = model()->index(mLastIndex,0) ;
QMap<int,QVariant> vMap;
vMap.insert(Qt::ForegroundRole, QVariant(QBrush(Qt::red))) ;
model()->setItemData(vIndex, vMap) ;

但它并没有改变颜色,而是不再显示该项目。知道出了什么问题吗?

【问题讨论】:

我会打电话给model()-&gt;setData(vIndex, QBrush(Qt::red), Qt::ForegroundRole); @vahancho Ty.它工作正常。但我不明白为什么 setItemData() 不起作用。 setItemData() 函数返回什么? 我不确定,但也许这会起作用:vMap.insert(Qt::ForegroundRole, QBrush(Qt::red)); model()-&gt;setItemData(vIndex, vMap);? @vahancho 不。有点奇怪。没关系,你给了我正确的解决方案。再次感谢。 【参考方案1】:

您的代码只是清除了模型中的所有数据,只留下了 Qt::ForegroundRole 的值,因为您的地图只包含新值。

这样做(它适用于大多数数据模型,而不仅仅是标准模型):

QModelIndex vIndex = model()->index(mLastIndex,0);
model->setData(vIndex, QBrush(Qt::red), Qt::ForegroundRole);

或者通过修改你的代码:

QModelIndex vIndex = model()->index(mLastIndex,0) ;
QMap<int,QVariant> vMap = model()->itemData(vIndex);
vMap.insert(Qt::ForegroundRole, QVariant(QBrush(Qt::red))) ;
model()->setItemData(vIndex, vMap) ;

【讨论】:

为您解答。有用。但我在文档中读到:不在角色中的角色将不会被修改。好吧,事实并非如此。 这是文档中的蹩脚句子。可能这意味着模型必须支持给定的角色(QStandardItemModel 支持所有可能的角色)。请注意,您可以提供自己的数据模型,该模型仅支持 DisplayRole 和 EditRole 等基本角色。 它应该支持所有包含 Qt::ForegroundRole 的 Qt::ItemDataRole。有什么奇怪的。也许是一个错误。 你不明白这并不意味着map和旧值合并,而是新map中的一些值可以忽略!

以上是关于如何更改 QListView 中项目的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Qt:更改 QListView 中的图标

Qt入门系列开发教程高级控件篇QListWidget列表小部件

Qt - 如何将 QListView 项目转移到另一个 QListView?

如何获取从 QListView 中选择的项目?

当 QListView 由 QComboBoxes 填充时获取信号

QListView 放置指示器样式