抛出问题:怎么才能使用样式表。
Qt style类似于CSS,使用方法。
菜鸟:
(1)直接用Qt的设计师填写相关样式,不在过多阐述。
(2)setStyleSheet(“”)这个函数可以设置样式表
setStyleSheet 注意事项:样式表一行写不下可以这样写。使用这个函数之前的样式就已经覆盖。
this->setStyleSheet("QPushButton{color:#FFFFFF;}"
"QPushButton:hover{color:red;}"
"")
使用这个函数设置时最方便的,但是代码里面写的多了,就跟屎一样。
因此,高级使用方法,如下:
(1)中级:通过Qt的属性来控制样式的使用,就可以不同在代码中使用sheStylesheet了,直接设置属性值,sheProperty,根据属性值直接就自动使用该值的样式,方法如下。
样式表中声明QtoolButton的悬浮状态,TQToolButtonOpen你可以把他理解为key值,true为状态值。
QToolButton:hover[TQToolButtonOpen="true"]{
background-color:#0279D0;
}
QToolButton:hover[TQToolButtonOpen="false"]{
background-color:red;
}
代码中使用;这样就能设置状态为false的样式,
toolBtn->setProperty("TQToolButtonOpen",QVariant(false));
如果设置了不起作用,可以尝试使用
this->style()->unpolish(this);
this->style()->polish(this);
(2)大神级别使用,场景,你需要放置一个按钮来设置全部界面样式的切换,怎么做。
思路:qss读取时本来就相当于一个QString,直接放到setStyleSheet中,只要我们每次按钮切换,重新拼接QString的qss,重新setstylesheet中,就能达到点击按钮直接切换全部样式的效果,但是这个多字符串怎么拼接。
方法:在样式表中
QMainWindow {
background-color:%BackgroundColor%;
color:%FontColor%;}
可以把%BackgroundColor%理解为占位符,bat脚本中,变量就是这么使用的。
然后代码:Q_PROPERTY Qt 最牛的地方
#define TT_PROPERTY(type, name)\
Q_PROPERTY(type name MEMBER name)\
type name
class StyleParam : public QObject
{
Q_OBJECT
public:
virtual ~StyleParam() = default;
TT_PROPERTY(QString, FontColor);
TT_PROPERTY(QString, BackgroundColor);
TT_PROPERTY(int, TabBorderRadius);
TT_PROPERTY(int, TabSpacing);
bool UseTemplateSheet;
QString AdditionalStyleSheet;
};
#undef TT_PROPERTY
extern const QString g_styleKool;
extern const QString g_styleVienna;
extern const QString g_styleThreshold;
}
Q_DECLARE_METATYPE(sm::Colors)
#endif // STYLE_H
全部工作已经准备好了 ,可以使用了,制造setstylesheet使用的QString
static void QSSFillStyle(QString& style, const sm::StyleParam& params)
{
style.clear();
if(params.UseTemplateSheet)
style = GetStyleTemplate();
//核心代码
int numProps = params.metaObject()->propertyCount();
for(int i=0; i<numProps; i++)
{
//核心
const QMetaProperty prop = params.metaObject()->property(i);
if(QString(prop.name()) == "objectName")
continue;
if(prop.type() == QVariant::Bool)
continue;
const QString propStr = QString("%") + prop.name() + "%";
if(!style.contains(propStr))
continue;
//巧妙替换所有变量,重新拼接字符串
style.replace(propStr, "%1");
const QVariant property = params.property(prop.name());
switch(prop.type())
{
case QVariant::String:
style = style.arg(property.toString());
break;
case QVariant::Int:
style = style.arg(property.toInt());
break;
case QVariant::UserType:
{
style = style.arg(property.toString());
break;
}
default:
break;
}
}
//最后就把样式正确的拼接成字符串就可以正常使用了
}