• 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

    void LoadStyle::LoadStyleFile(QString strStyle)
    {
    	QFile qss(strStyle);
    	qss.open(QFile::ReadOnly);
    	qApp->setStyleSheet(qss.readAll());
    	qss.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

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

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

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

    CTreeWidgetPro QPushButton#m_pBtn
    {
    	background:red;
    	width:40px;
    	height:20px;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    加载所有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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

     m_cLoadStyle.LoadStyleFile();
    
    • 1

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

    总结

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

  • 相关阅读:
    Python中的变量与注释
    在编程中如何使用数字-python
    如何在Java中读取超过内存大小的文件
    C++ 不知树系列之认识二叉树(顺序、链表存储的实现)
    解决:PowerDesigne找不到右边表的工具栏
    docker启动容器报错
    【校招VIP】java语言考点之双亲委派模型
    docker-ip与服务器ip冲突问题
    『吴秋霖赠书活动 | 第二期』《ChatGPT原理与实战》
    Chapter 6 CNN(Convolutional Neural Network)
  • 原文地址:https://blog.csdn.net/qq_40876689/article/details/126547998