QSS设置不生效问题

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 为例
  1. 加载qss的时候是先子后父,show()确保风格设置上去的时候,是先父后子
  2. 子与父qss加载的过程就是将相应解析的qss放到QHash表中
  1. 加载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