gpt4 book ai didi

c++ - QHeaderView::paintSection 做了什么,以至于我在之前或之后对画家所做的一切都被忽略了

转载 作者:太空狗 更新时间:2023-10-29 20:23:55 25 4
gpt4 key购买 nike

这个问题是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,我用 painter 绘制的任何东西都不可见(我也尝试绘制对角线)。如果我删除 QHeaderView::paintSection 调用,线条和背景将可见。在 QHeaderView::paintSection 之前和之后调用 fillRect 没有任何区别。

我想知道,QHeaderView::paintSection 是什么让我无法在其上绘制内容。是否有一种方法可以在不重新实现 QHeaderView::paintSection 所做的一切的情况下克服它?

我需要做的就是为某个单元格添加某种阴影 - 我仍然希望单元格中的所有内容(文本、图标、渐变背景等)都按现在的样子绘制...

最佳答案

很明显为什么第一个 fillRect 不起作用。您在 paintSection 之前绘制的所有内容都将被基础绘制覆盖。

第二个调用更有趣。

通常所有的绘制方法都保留painter 状态。这意味着当您调用 paint 时,看起来画家状态没有改变。

尽管如此,QHeaderView::paintSection 破坏了 painter 状态。

要绕过这个问题,您需要自己保存和恢复状态:

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>());
}

关于c++ - QHeaderView::paintSection 做了什么,以至于我在之前或之后对画家所做的一切都被忽略了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30847252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com