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

展开阅读全文

没有更多推荐了,返回首页