我需要实现自己的 QAbstractTableModel 吗?
Posted
技术标签:
【中文标题】我需要实现自己的 QAbstractTableModel 吗?【英文标题】:Do I need to implement my own QAbstractTableModel? 【发布时间】:2012-02-19 02:27:02 【问题描述】:我发现了这个问题:How to change the background color for a QTreeView Header (aka QHeaderView)?
我希望能够为每个标题部分设置颜色。所以上面看到的问题似乎是我的解决方案!
解决方案说“最简单的方法可能是从 QAbstractItemModel 或其他模型类派生新模型并重新实现 headerData()”。我去了looked at the Qt source tree for QTableWidget, QTableModel, QTableWidgetItem... 这些类据说是“默认模型”,所以我认为它们会是一个很好的例子,然后我会去实现我自己的 QAbstractTableModel。
我看到的 3 个文件有 3300 行代码。这绝对不是“最简单的方法”IMO!!!
我想要 QTableWidget 的功能,但我想添加以下功能:
horizontalHeader.setSectionColor(index,color) verticalHeader.setSectionColor(index,color)如果我只想更改节标题的颜色,我真的需要继承/实现 QAbstractTableModel 吗?
更新:
我没有使用我自己的自定义视图和模型类。我现在正在使用the convenience class QTableWidget(它被称为便利类b/c,它实现了视图和模型)。函数headerData()
是模型的一部分。 model class, QTableModel, 不能通过 Qt lib/headers 访问,所以我不能从它继承。
更新:
我尝试使用背景画笔QBrush(QColor(Qt::red))
创建一个新项目,然后使用新项目设置表头(使用QTableWidget::setHorizontalHeaderItem(int column, QTableWidgetItem *item)
。我还尝试继承QTableWidgetItem
并使用以下方法覆盖虚拟data()
方法:
QVariant HeaderItem::data(int role) const
if(role==Qt::BackgroundRole)
return QVariant(QBrush(QColor(Qt::red)));
else if(role==Qt::ForegroundRole)
return QVariant(QBrush(QColor(Qt::green)));
else
return QTableWidgetItem::data(role);
我可以更改标题部分的前景。但是当我尝试更改页眉的背景画笔时……什么也没有发生……就像我为页眉部分设置的 QTableWidgetItem 的背景画笔被忽略了一样。
【问题讨论】:
为什么不能只覆盖视图使用的模型的 headerData 方法?您的确切设置是什么,即您使用哪个小部件和模型类? @chalup 我为你更新了问题。 也许提供自定义 QHeaderView 可以解决问题...我会尝试一下。 【参考方案1】:不要从头开始使用自定义 headerData() 创建模型,而是使用 QTableWidgetItem::data() 的所需实现创建 QTableWidgetItem 的子类,并将此类的实例用于 QTableWidget::setHorizontalHeaderItem。
【讨论】:
以上是关于我需要实现自己的 QAbstractTableModel 吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何实现我自己的selectAll:对于没有子类的UITextView呢?