使用Qt做样式定制,经常会使用QSS对控件UI进行美化,但使用过程中会遇到很多的细节,这里摘取一二记录备忘。
问题一、自定义窗体(继承自QWidget)样式表不生效:
原因:qss样式需要通过paint才能正常绘制到控件表面,而QWidget的paintEvent()是空的,这就要求我们在继承QWidget的时候重载paintEvent()。 如下所示:
//If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
//The above code is a no-operation if there is no stylesheet set
说明:当然,如果使用QFrame代替QWidget,也就是说自定义窗体继承自QFrame(并且带有框架属性),则qss样式是可以生效的。
问题二:如何在运行时动态的改变控件的样式?
解决方案:
1)我们可以在代码中动态的设置控件的objectName (相当于QSS样式的选择器). 但使用setObjectName方法后,会发现控件的样式并没有实时的刷新,这就需要我们手动的 setStyle 让控件动态的改变qss样式。 如下所示:
void GBAUtils::resetStyleSheet(QWidget *w)
{
//w->style()->unpolish(w); //清除旧的样式
//w->style()->polish(w); //更新为新的样式
w->setStyle(w->style());
}
参考文章:
qt中动态变更objectname来动态变动控件样式_setobjectname qt 马上更新_雨田嘟嘟的博客-CSDN博客