更改 QTableModel 中单元格的背景颜色

Posted

技术标签:

【中文标题】更改 QTableModel 中单元格的背景颜色【英文标题】:Change background color for a cell in a QTableModel 【发布时间】:2017-12-22 10:22:57 【问题描述】:

我想为QTableView 中的单元格着色。

所以我正在尝试更改关联QTableModel中相应项目的itemData

为此,我使用QAbstractTableModel 类的setItemData 方法。

在文档中:

QAbstractItemModel::setItemData(const QModelIndex & index, const QMap < int, QVariant > & roles)

这是我的一段代码:

color = QtGui.QColor(Qt.red)
self.model.setItemData(self.model.index(3,3),color,Qt.BackgroundRole)

我认为这会将模型的第三个单元格(水平和垂直)涂成红色。

但应用程序回答:

TypeError: QAbstractItemModel.setItemData(QModelIndex, dict-of-int-QVariant): argument 2 has unexpected type 'QColor'

如果我尝试将 Qcolor 类型转换为 Qvariant

color = Qt.QVariant(QtGui.QColor(Qt.red))
self.model.setItemData(self.model.index(3,3),color,Qt.BackgroundRole)

答案:

TypeError: PyQt4.QtCore.QVariant represents a mapped type and cannot be instantiated

我真的无法理解。

所以我的问题是:我必须在setItemData 方法的第二个参数中放入哪种类型的数据?

感谢提前

【问题讨论】:

setItemData 不接受颜色作为第二个索引 是的,我误解了文档。我认为一种颜色是预期的,但它是一个 Qmap。使用setData,问题就解决了。谢谢。 【参考方案1】:

您应该使用QAbstractItemModel::setData 在itemData 映射中设置单个值。

self.model.setData(self.model.index(3,3),color,Qt.BackgroundRole)

如果您想一次设置多个值,可以使用QAbstractItemModel::setItemData,但必须构建一个QMap,其中每对由一个角色及其对应的值组成:

 QMap<int, QVariant> map;
 map.insert(Qt::BackgroundRole, color);
 self.model.setItemData(self.model.index(3,3), map);

【讨论】:

非常感谢 p-a-o-l-o!多亏了你,我终于明白了 setItemData 是如何工作的。我用过setData,错误信息消失了。 (3,3) 单元格没有改变颜色,但这是另一个问题! ;-) 这个问题解决了。

以上是关于更改 QTableModel 中单元格的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改每个其他单元格的 UItableViewCell 背景颜色

更改单元格的背景颜色

更改视图外单元格的背景颜色

如何更改子单元格的单元格背景颜色

C# 弹性体。更改背景单元格的颜色。 Excel

如何在listview android中仅更改第二个单元格的背景颜色