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设置不生效问题_第1张图片
QSS设置不生效问题_第2张图片
Qss 样式实现的具体过程
QPushButton 为例
  1. 加载qss的时候是先子后父,show()确保风格设置上去的时候,是先父后子
  2. 子与父qss加载的过程就是将相应解析的qss放到QHash表中
  1. 加载qss qstylesheetstyle.cpp
    QVector QStyleSheetStyle::styleRules( const QObject *obj) const
QSS设置不生效问题_第3张图片 QSS设置不生效问题_第4张图片 QSS设置不生效问题_第5张图片 QSS设置不生效问题_第6张图片
2. 生成颜色对象
qstylesheetstyle.cpp
QRenderRule ::QRenderRule( const QVector &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 )
QSS设置不生效问题_第7张图片
3. 加载 qss 与生成样式对象均由 QRenderRule QStyleSheetStyle ::renderRule( const QObject *obj, int element, quint64 state) const 函数调用
QSS设置不生效问题_第8张图片QSS设置不生效问题_第9张图片
4. 绘制 Button
QSS设置不生效问题_第10张图片QSS设置不生效问题_第11张图片

你可能感兴趣的:(Qt,qss,setStyleSheet,tableview,QPushButton)