【问题标题】:Do I need to implement my own QAbstractTableModel?我需要实现自己的 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 可以解决问题...我会尝试一下。

标签: c++ qt user-interface inheritance abstract-class


【解决方案1】:

不要从头开始使用自定义 headerData() 创建模型,而是使用 QTableWidgetItem::data() 的所需实现创建 QTableWidgetItem 的子类,并将此类的实例用于 QTableWidget::setHorizontalHeaderItem

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 2014-01-19
    • 2012-07-31
    • 2017-03-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多