問題描述
這個(gè)問題是這篇文章 是不同的,雖然看起來與 這個(gè).
This question is further development of this post and is different, though may seem similar as this one.
我正在嘗試重新實(shí)現(xiàn) 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>());
}
但是,它不起作用 - 如果我調(diào)用 QHeaderView::paintSection
,我用畫家繪制的任何東西都不可見(我也嘗試?yán)L制對(duì)角線).如果我刪除 QHeaderView::paintSection
調(diào)用,線條和背景將可見.在 QHeaderView::paintSection
之前和之后調(diào)用 fillRect
沒有任何區(qū)別.
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
是什么讓我無法在它上面畫一些東西.以及是否有一種方法可以在不重新實(shí)現(xiàn) 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?
我需要做的就是為某個(gè)單元格添加某種陰影 - 我仍然希望單元格中的所有內(nèi)容(文本、圖標(biāo)、漸變背景等)都按照現(xiàn)在的方式繪制...
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...
推薦答案
很明顯為什么第一個(gè) fillRect
不起作用.您在 paintSection
之前繪制的所有內(nèi)容都將被基礎(chǔ)繪制覆蓋.
It is obvious why the first fillRect
doesn't work. Everything that you paint before paintSection
is overridden by base painting.
第二個(gè)調(diào)用更有趣.
通常所有的繪制方法都會(huì)保留 painter
狀態(tài).這意味著當(dāng)你調(diào)用 paint
時(shí),它看起來像畫家狀態(tài)沒有改變.
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
破壞了畫家的狀態(tài).
Nevertheless QHeaderView::paintSection
spoils the painter state.
要繞過這個(gè)問題,您需要自己保存和恢復(fù)狀態(tài):
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>());
}
這篇關(guān)于QHeaderView::paintSection 做了什么,以至于我在之前或之后對(duì)畫家所做的一切都被忽略了的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!