問題描述
這個問題是這篇文章 是不同的,雖然看起來與 這個.
This question is further development of this post and is different, though may seem similar as this one.
我正在嘗試重新實現 QHeaderView::paintSection
,以便從模型返回的背景得到尊重.我試著這樣做
I am trying to reimplement QHeaderView::paintSection
, so that the background returned from the model would be honored. I tried to do this
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
沒有任何區別.
However, it didn't work - if I make QHeaderView::paintSection
call, nothing I draw with the painter is visible (I also tried drawing a diagonal line). If I remove QHeaderView::paintSection
call, the line and the background will be visible.
Making the fillRect
call before vs. after the QHeaderView::paintSection
doesn't make any difference.
我想知道,QHeaderView::paintSection
是什么讓我無法在它上面畫一些東西.以及是否有一種方法可以在不重新實現 QHeaderView::paintSection
所做的一切的情況下克服它?
I wonder, what is it that QHeaderView::paintSection
does that makes it impossible for me to draw something on top of it.
And whether there is a way to overcome it without reimplementing everythning what QHeaderView::paintSection
does?
我需要做的就是為某個單元格添加某種陰影 - 我仍然希望單元格中的所有內容(文本、圖標、漸變背景等)都按照現在的方式繪制...
All I need to do is to add a certain shade to a certain cell - I still want everything in the cell (text, icons, gradient background etc.) to be painted as it is now...
推薦答案
很明顯為什么第一個 fillRect
不起作用.您在 paintSection
之前繪制的所有內容都將被基礎繪制覆蓋.
It is obvious why the first fillRect
doesn't work. Everything that you paint before paintSection
is overridden by base painting.
第二個調用更有趣.
通常所有的繪制方法都會保留 painter
狀態.這意味著當你調用 paint
時,它看起來像畫家狀態沒有改變.
Usually all paint methods preserves painter
state. It means that when you call paint
it looks like the painter state hasn't been changed.
盡管如此,QHeaderView::paintSection
破壞了畫家的狀態.
Nevertheless QHeaderView::paintSection
spoils the painter state.
要繞過這個問題,您需要自己保存和恢復狀態:
To bypass the issue you need to save and restore the state by yourself:
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>());
}
這篇關于QHeaderView::paintSection 做了什么,以至于我在之前或之后對畫家所做的一切都被忽略了的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!