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


这是一个目录

  • 前言
  • 加载QSS样式文件三种写法
    • 第一种:界面少,只有一个样式文件
    • 第二种:项目稍微复杂,有多个样式文件
    • 第三种:界面很多,一个界面类对应一个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文件,这部分代码也不用进行修改。
总结 【QT加载多个QSS样式文件的优雅写法!】随着写的界面越来越多,发现规范真的很重要,目前想到的可读性最强的方式就是一个界面类对应一个QSS这种文件,如果那个界面类样式不对了,直接能定位到对应的的QSS文件中,就很方便!记录至此,兄弟们,一起加油,一起变强!

    推荐阅读