为了满足不同客户对不同风格的皮肤要求,通常需要在程序中携带多种皮肤资源,这个时候我们就需要能够随时随地只发布新皮肤。

通常我的做法如下:

一、生成rcc文件

1. 每一个UI对应一个css样式文件(css基本等同于qss),为了方便管理,样式文件名称与UI类名一致。例如:

CLoginDlg.css

/*
登陆窗口样式表 CLoginDlg
*/
.CLoginDlg{border:1px solid #4D4D4D;border-radius:5px;/*background-image:url(:/src/image/DlgLogin.bmp)*/
}/*关闭按钮*/
QPushButton#btnClose{border-image:url(:/src/image/denglu_close.bmp) 0 0 96 0;
}
QPushButton#btnClose:hover{border-image:url(:/src/image/denglu_close.bmp) 24 0 72 0
}
QPushButton#btnClose:pressed{border-image:url(:/src/image/denglu_close.bmp) 48 0 48 0
}

2. 所有UI对应的样式表文件编辑好了后,需要将他们添加到qrc资源文件中。可以利用QtCreator的向导新建qrc文件并且把样式表添加到qrc中,例如main.qrc中qss属性下的几个css后缀的文件:

main.qrc

<RCC><qresource prefix="/qss"><file>stylesheet.css</file><file>CLoginDlg.css</file><file>CMsgBox.css</file></qresource><qresource prefix="/src"><file>image/main.ico</file><file>image/DlgLogin.bmp</file><file>image/denglu_close.bmp</file><file>image/denglu_min.bmp</file><file>image/DlgLogin_set.bmp</file><file>image/checkbox.bmp</file><file>image/DlgLogin_login.bmp</file><file>image/xialazhishi.png</file><file>image/login_head.png</file><file>image/LOGIN_LIST_CLOSE.png</file><file>image/diseanniubeijing.bmp</file></qresource>
</RCC>

3. 将所有样式表中需要用到的图片资源、字体资源、音视频资源等等都添加到上述的main.qrc中,这一步可以利用向导去添加,节省时间。例如上述main.qrc中的png和bmp文件

4. 打开Qt的命令行工具,并cd到main.qrc所在的目录,输入以下命令:

rcc -binary main.qrc -o main.rcc

最终在生成了main.rcc文件,当然这个文件名可以任意的。

关于rcc的更多用法,可以参考QResource中的说明,或者直接在帮助文档中搜索rcc

5. 在开发的初期为了方便UI样式调整,可以将main.qrc添加到工程中,但是等到后期这套方案稳定了,就没必要将mian.qrc放到工程中,更不用将资源文件添加工程中,只需要rcc文件即可。这样可以减少exe文件大小。

6. 当需要增加新皮肤时,只需要按照上述的步骤,重新修改css、替换图片等等相关资源文件,然后重新生成rcc文件即可。

7. 每个css样式表中用到的资源,在main.qrc中必须能找得到,而且路径也不能错(符合Qt的qrc搜索路径规则,即 :/ 开头),否则样式不起作用,例如  :/src/image/denglu_close.bmp。

上面所提到的 main.qrc  CLoginDlg.css等等,名称都可以随便取,内含的资源路径也可以随便放,但是main.qrc里面的css资源路径配置是一定不能变更的,因为代码里面是通过

QFile file(":/qss/CLoginDlg.css")去加载css文件并读取css中的内容,然后调用widget->setStyleSheet(css内容)去实现ui样式更换的。

二、使用rcc和换肤

1. 将rcc注册到系统中

CResourceHelpers::RegistUIResource("你的rcc路径");当然你可以把一个默认的rcc配置到系统中,随着exe一起打包,这样不至于没有rcc时界面难看,此时你的rcc路径可以写成一个资源路径。

2. 在每个UI类的构造函数中调用

CResourceHelpers::SetStyleSheet(this, "CLoginDlg");

这个调用一般紧跟在 setupUi()后面

3. 当每次切换皮肤时,只需要调用CResourceHelpers::RegistUIResource即可。

class CResourceHelpers
{
private:static QString m_strRccFileName;
public:CHelpers();~CHelpers();//注册UI资源rcc文件static bool RegistUIResource(const QString& strResourceName){if (!m_strRccFileName.isEmpty()){QResource::unregisterResource(QString("%1/skin/%2").arg(qApp->applicationDirPath()).arg(m_strRccFileName));}m_strRccFileName = strResourceName;if (QResource::registerResource(QString("%1/skin/%2").arg(qApp->applicationDirPath()).arg(m_strRccFileName))){//加载全局的QString qss = GetStyleSheet("stylesheet");if (!qss.isEmpty()){qApp->setStyleSheet(qss);}return true;}return false;}//从rcc文件中加载qss,并设置到qwidget中static bool SetStyleSheet(QWidget* pWidget, const QString& strQssName){QString str = GetStyleSheet(strQssName);if (str.isEmpty()){return false;}pWidget->setStyleSheet(str);return true;}
private:static QString GetStyleSheet(const QString& strQssName){QString strQss;QFile file(QString(":/qss/%1.css").arg(strQssName));if (file.open(QIODevice::ReadOnly)){strQss = QLatin1String(file.readAll());file.close();return strQss;}return strQss;}};

Qt的rcc资源,换肤或新皮肤发布相关推荐

  1. C#如何使用skinEngine控件换肤(更换皮肤)?

    在使用C#开发窗体程序时,原始的皮肤方案比较难看,因此开发者需要更换皮肤,以提高客户体验.skinEngine控件就是一个很好的解决方案,它可以降低开发者开发新皮肤的成本,一个新手也可以很快的掌握更换 ...

  2. Qt实现360安全卫士换肤功能

    效果如下: 问题:标题的换肤背景未显示出来 要实现换肤功能,我们先创建一个基于drop_shadow_widget的护肤界面,我们将换肤界面分为上中下三部分.(drop_shadow_widget的功 ...

  3. c语言中用qt写换肤,让Qt应用程序支持换肤(Skin)功能

    Qt程序一直给人的印象是正规的GUI程序的模样.在嵌入式Linux下,Qtopia的桌面看起来跟WinCE桌面没有什么两样.相对IPHONE那样的漂亮界面.实在没有什么吸引力. 因此很多嵌入式开发人员 ...

  4. 辛苦了一个下午和晚上,给Blog换了个新皮肤

    见08年快到了,呵呵,之前那个皮肤从一开始到博客园用到现在,想了很久,总算学决心给我的小博客园换上新衣了. 呵呵,一看就知道皮肤不是我做的,在http://www.freecsstemplates.o ...

  5. Qt编写安防视频监控系统11-动态换肤

    一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据 ...

  6. Windows Phone 资源管理与换肤思考

    Windows Phone 资源管理与换肤思考 原文 Windows Phone 资源管理与换肤思考 新入手一台Windows 8的笔记本,安装了VS2013后,终于又可以开发WP了.公司暂时不愿意开 ...

  7. Android换肤功能实现与换肤框架QSkinLoader使用方式介绍

    框架地址:https://github.com/qqliu10u/QSkinLoader 效果图 https://github.com/qqliu10u/QSkinLoader/raw/master/ ...

  8. Android 应用换肤方案的总结

    虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题.在这篇文章中,我将对 Android 现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换肤方案的可能 ...

  9. 对 Android 应用换肤方案的总结

    作者:me 虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题.在这篇文章中,我将对 Android 现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换 ...

最新文章

  1. 基于fpga的数码管动态扫描电路设计_【至简设计案例系列】基于FPGA的密码锁设计(altera版)...
  2. X86嵌入式主板在IOT网关产品的应用
  3. [转]Redis持久化存储(AOF与RDB两种模式)
  4. 安装应用程序时,提示以前的某个程序安装挂起的解决方法
  5. POJ 1163 The Triangle
  6. 详细讲解 委托和事件
  7. cmd切换为administrator用户
  8. web测试和一般的应用程序测试的主要区别
  9. Star Schema完全参考手册读书笔记三
  10. 怎样用一份数据透视表打动老板
  11. NetscalerSSL证书的导入和link
  12. Microsoft SQL Server Integration Service文章总结
  13. python通信工程定额_通信工程2008版定额和2017版定额简单对比
  14. 产品经理必读书单(2019史上最全)
  15. 网页回拨-Web CallBack
  16. matlab心碎的心,让人撕心裂肺的心痛网名,心碎绝望的伤感昵称
  17. 在三人易行学习PLC编程有什么好处?
  18. Flutter基础之部分控件学习
  19. win10 metro app(应用商店中的APP)如何走代理?
  20. Unity点击物体后,移动到物体所在位置

热门文章

  1. [464]Outlook如何备份邮件
  2. 上传图片时获取图片的宽高度
  3. 推荐一个批量群控N台远程桌面的效率工具-黑马远程桌面5.12版
  4. 中国最早的计算机汉字系统,1983年10月,中国王永民发明了( )汉字输入法,计算机汉字输入问题得到根..._考试资料网...
  5. CRM实施能给客户带来什么好处
  6. centos8 + kubernetes 1.24 master/node 节点
  7. RabbitMQ 的使用场景有哪些?
  8. C++虚继承中的虚基类表
  9. java jdk1.9下载
  10. 珊瑚虫论坛版主自建网站声援珊瑚虫QQ