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