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