bug
描述:
TableView
表頭初始化後,選中item
的表頭沒有按照產品qss
樣式顯示
Bug
原因:
兩次設置qss
時,由於緩存中沒有更新qss
樣式,造成樣式顯示的還是原來的樣式
修改方案:
第一種:設置qss
之後,使用addWidget(
)代替直接傳父
第二種:設置qss
之後,使用setParent()
方式代替直接傳父
Demo
復現
:
QWidget
*
pWidget
=
new
QWidget
;
QPushButton
*
pPushButton
=
new
QPushButton
(
"test----ddddd"
);
pPushButton->setParent(pWidget);
pWidget->setStyleSheet(
"QPushButton{color:yellow}"
);
pWidget->setStyleSheet(
"QPushButton{color:red}"
);
//
pPushButton->setParent(pWidget);
pWidget->show();
備註:
1.QSS是父子關係的時候是可以傳遞的。繼承關係不是父子關係,所以繼承不具備傳遞。
2.Qt5.1.1
沒有此bug
(每次設置qss
時,會清空緩衝區)
3.Qt5.5.1
有這個bug
(第二次設置qss
時,d->polish
爲假,直接返回,所以沒有調用roxy->repolish(
this)
,造成沒有清空緩衝區)
Qss
樣式實現的具體過程
以
QPushButton
爲例
- 加載qss的時候是先子後父,show()確保風格設置上去的時候,是先父後子
- 子與父qss加載的過程就是將相應解析的qss放到QHash表中
- 加載qss qstylesheetstyle.cpp
QVector<QCss::StyleRule>
QStyleSheetStyle::styleRules(
const
QObject
*obj)
const
2.
生成顏色對象
qstylesheetstyle.cpp
QRenderRule
::QRenderRule(
const
QVector
<Declaration>
&declarations,
const
QObject
*object)
:
features
(
0
),
hasFont
(
false
),
pal
(
0
),
b
(
0
),
bg
(
0
),
bd
(
0
),
ou
(
0
),
geo
(
0
),
p
(
0
),
img
(
0
),
clipset
(
0
)
3.
加載
qss
與生成樣式對象均由
QRenderRule
QStyleSheetStyle
::renderRule(
const
QObject
*obj,
int
element,
quint64
state)
const
函數調用
4.
繪製
Button