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&lt;QBrush&gt;() 会返回什么?它是有效的QBrush 吗? 模型将返回一个 QBrush 或一个空的 QVariant(如果不需要自定义背景)。 bg.isValid 负责后者。所以,是的 - bg.value() 返回有效的画笔。如果我评论 QHeaderView::paintSection 调用,我可以看到矩形被正确填充 QHeaderView::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 做了啥,以至于我之前或之后对画家所做的一切都被忽略了的主要内容,如果未能解决你的问题,请参考以下文章