QT加载多个QSS样式文件的优雅写法!

前言

使用QT写界面样式,就一定要涉及到加载QSS样式文件,随着软件界面不断增加,样式文件也不断增加,所以本次记录一下一个加载多个样式文件且一劳永逸的办法。

加载QSS样式文件三种写法

注:(项目复杂界面多,QSS样式文件也是多个,推荐第三种写法。)
加载QSS样式文件,肯定是要进行读文件的操作,这一步必须要有。但回顾自己的开发历程,加载QSS文件大致有三种写法,虽然都要读文件,但是还是很有区别的:

第一种:界面少,只有一个样式文件

在项目比较小的时候,没有几个界面,直接将所有样式写在一个样式文件中就全部搞定。大致如下:

QFile file(":/qss/style.qss");
file.open(QIODevice::ReadOnly);
QString stylesheet = QLatin1String(file.readAll());
file.colse();
qApp->setStyleSheet(stylesheet);

第二种:项目稍微复杂,有多个样式文件

随着软件功能复杂,界面增多,就不能写在一个样式文件中,基本上一个界面类单独配置一个QSS文件,增强可读性,也方便后期查阅修改。
所以当一个资源文件下有多个QSS样式文件时,可以写一个函数用来专门读取文件内容,如下:

void LoadStyle::LoadStyleFile(QString strStyle)
{
	QFile qss(strStyle);
	qss.open(QFile::ReadOnly);
	qApp->setStyleSheet(qss.readAll());
	qss.close();
}

在主界面初始化时,调用这个函数,并把资源文件也就是QSS文件路径传进去:

m_cLoadStyle.LoadStyleFile(":/CTreeWidgetPro/Resource/Qss/CTreeWidgetPro.qss");
m_cLoadStyle.LoadStyleFile(":/CTreeWidgetPro/Resource/Qss/CustomItem.qss");

其中m_cLoadStyle是加载资源文件类的对象,直接多次调LoadStyleFile(QString strStyle)这个函数也可实现。

第三种:界面很多,一个界面类对应一个QSS样式文件

首先一个类对应一个样式文件时,为了确保唯一性,会在每一个样式属性前面加上类名就可以了,举个例子:

CTreeWidgetPro QPushButton#m_pBtn
{
	background:red;
	width:40px;
	height:20px;
}

就像这样式的,如果你担心类名重复,还可以加上命名空间的名称,就不做具体展示了。

加载所有QSS文件大致思路是将QSS文件所在的文件夹下的所有样式文件都一次获取,循环读文件里面的内容,然后保存在一个字符串变量中,最后直接调用qApp->setStyleSheet()这个函数。

void LoadStyle::LoadStyleFile()
{
	QString strDirPath = ":/CTreeWidgetPro/Resource/Qss";
	QStringList strListStyleFiles = QDir(strDirPath).entryList(QDir::Files);
	QString strStyle = GetAllStyle(strListStyleFiles, strDirPath);
	qApp->setStyleSheet(strStyle);
}
QString LoadStyle::GetAllStyle(QStringList strListStyleFiles, QString strDirPath)
{
	if (!strDirPath.endsWith("/"))
	{
		strDirPath.append("/");
	}
	QString strStyle;
	for (auto strFileName : strListStyleFiles)
	{
		QFile fileRead(strDirPath + strFileName);
		if (fileRead.open(QFile::ReadOnly))
		{
			strStyle += QLatin1String(fileRead.readAll());
		}
		fileRead.close();
	}
	return strStyle;
}

LoadStyleFile()函数中,strDirPath变量是QSS文件所在的文件夹;strListStyleFiles保存了文件夹下面所有文件的文件名称;
GetAllStyle()函数中,在for循环中处理每一个文件名,将文件夹路径+文件名就组成了完整了QSS文件路径,在进行读操作,将所有的文件读完之后保存并返回。

 m_cLoadStyle.LoadStyleFile();

最后只要在主界面调用这个LoadStyleFile();函数即可:
m_cLoadStyle是加载资源文件类的对象,不管资源文件夹下面多少个QSS样式文件,都只需要调用一次即可,后续资源文件中继续添加新的QSS文件,这部分代码也不用进行修改。

总结

随着写的界面越来越多,发现规范真的很重要,目前想到的可读性最强的方式就是一个界面类对应一个QSS这种文件,如果那个界面类样式不对了,直接能定位到对应的的QSS文件中,就很方便!记录至此,兄弟们,一起加油,一起变强!

  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值