我需要实现自己的 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 的功能,但我想添加以下功能:

horizo​​ntalHeader.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呢?

Java - 实现我自己的 Stream [关闭]

自己实现一个简单的线程池

交流中的提问--聚焦自己的需求

Object类的Cloneable接口没有实现所以需要自己进行相关的实现

为啥 Arrays.asList() 返回自己的 ArrayList 实现