【发布时间】: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 可以解决问题...我会尝试一下。
标签: c++ qt user-interface inheritance abstract-class