QHeaderView::paintSection 做了啥,以至于我之前或之后对画家所做的一切都被忽略了
Posted
技术标签:
【中文标题】QHeaderView::paintSection 做了啥,以至于我之前或之后对画家所做的一切都被忽略了【英文标题】:What does QHeaderView::paintSection do such that all I do to the painter before or after is ignoredQHeaderView::paintSection 做了什么,以至于我之前或之后对画家所做的一切都被忽略了 【发布时间】:2015-06-15 14:05:05 【问题描述】:这个问题是this post 的进一步发展,虽然看起来与this one 相似,但有所不同。
我正在尝试重新实现QHeaderView::paintSection
,以便从模型返回的背景得到尊重。我试着这样做
void Header::paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const
QVariant bg = model()->headerData(logicalIndex, Qt::Horizontal, Qt::BackgroundRole);
// try before
if(bg.isValid()) // workaround for Qt bug https://bugreports.qt.io/browse/QTBUG-46216
painter->fillRect(rect, bg.value<QBrush>());
QHeaderView::paintSection(painter, rect, logicalIndex);
// try after
if(bg.isValid()) // workaround for Qt bug https://bugreports.qt.io/browse/QTBUG-46216
painter->fillRect(rect, bg.value<QBrush>());
但是,它不起作用 - 如果我拨打 QHeaderView::paintSection
电话,我用画家绘制的任何内容都不可见(我也尝试绘制对角线)。如果我删除QHeaderView::paintSection
调用,线条和背景将可见。
在QHeaderView::paintSection
之前和之后进行fillRect
调用没有任何区别。
我想知道,QHeaderView::paintSection
做了什么让我无法在它上面画东西。
以及是否有一种方法可以在不重新实现 QHeaderView::paintSection
所做的一切的情况下克服它?
我需要做的就是为某个单元格添加某种阴影 - 我仍然希望单元格中的所有内容(文本、图标、渐变背景等)都像现在一样绘制...
【问题讨论】:
bg.value<QBrush>()
会返回什么?它是有效的QBrush
吗?
模型将返回一个 QBrush 或一个空的 QVariant(如果不需要自定义背景)。 bg.isValid 负责后者。所以,是的 - bg.valueQHeaderView::paintSection
正在您的矩形顶部绘制...它可能会覆盖它...尝试更改调用顺序
我之前和之后都试过了,结果一样 - 什么都没有显示
我之前和之后都试过了 - 更新了代码示例 - 都不行
【参考方案1】:
很明显为什么第一个fillRect
不起作用。您在paintSection
之前绘制的所有内容都会被基础绘制覆盖。
第二个电话更有趣。
通常所有的绘制方法都会保留painter
状态。这意味着当你调用paint
时,看起来画家状态没有改变。
尽管如此QHeaderView::paintSection
破坏了画家的状态。
要绕过需要自己保存和恢复状态的问题:
void Header::paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const
QVariant bg = model()->headerData(logicalIndex, Qt::Horizontal, Qt::BackgroundRole);
painter->save();
QHeaderView::paintSection(painter, rect, logicalIndex);
painter->restore();
if(bg.isValid())
painter->fillRect(rect, bg.value<QBrush>());
【讨论】:
我该如何实现这个。我需要 .h 和 .cpp 吗?我在 main() 中需要什么代码来为我的标题着色?以上是关于QHeaderView::paintSection 做了啥,以至于我之前或之后对画家所做的一切都被忽略了的主要内容,如果未能解决你的问题,请参考以下文章