Qt的rcc资源,换肤或新皮肤发布
为了满足不同客户对不同风格的皮肤要求,通常需要在程序中携带多种皮肤资源,这个时候我们就需要能够随时随地只发布新皮肤。
通常我的做法如下:
一、生成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资源,换肤或新皮肤发布相关推荐
- C#如何使用skinEngine控件换肤(更换皮肤)?
在使用C#开发窗体程序时,原始的皮肤方案比较难看,因此开发者需要更换皮肤,以提高客户体验.skinEngine控件就是一个很好的解决方案,它可以降低开发者开发新皮肤的成本,一个新手也可以很快的掌握更换 ...
- Qt实现360安全卫士换肤功能
效果如下: 问题:标题的换肤背景未显示出来 要实现换肤功能,我们先创建一个基于drop_shadow_widget的护肤界面,我们将换肤界面分为上中下三部分.(drop_shadow_widget的功 ...
- c语言中用qt写换肤,让Qt应用程序支持换肤(Skin)功能
Qt程序一直给人的印象是正规的GUI程序的模样.在嵌入式Linux下,Qtopia的桌面看起来跟WinCE桌面没有什么两样.相对IPHONE那样的漂亮界面.实在没有什么吸引力. 因此很多嵌入式开发人员 ...
- 辛苦了一个下午和晚上,给Blog换了个新皮肤
见08年快到了,呵呵,之前那个皮肤从一开始到博客园用到现在,想了很久,总算学决心给我的小博客园换上新衣了. 呵呵,一看就知道皮肤不是我做的,在http://www.freecsstemplates.o ...
- Qt编写安防视频监控系统11-动态换肤
一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据 ...
- Windows Phone 资源管理与换肤思考
Windows Phone 资源管理与换肤思考 原文 Windows Phone 资源管理与换肤思考 新入手一台Windows 8的笔记本,安装了VS2013后,终于又可以开发WP了.公司暂时不愿意开 ...
- Android换肤功能实现与换肤框架QSkinLoader使用方式介绍
框架地址:https://github.com/qqliu10u/QSkinLoader 效果图 https://github.com/qqliu10u/QSkinLoader/raw/master/ ...
- Android 应用换肤方案的总结
虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题.在这篇文章中,我将对 Android 现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换肤方案的可能 ...
- 对 Android 应用换肤方案的总结
作者:me 虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题.在这篇文章中,我将对 Android 现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换 ...
最新文章
- 基于fpga的数码管动态扫描电路设计_【至简设计案例系列】基于FPGA的密码锁设计(altera版)...
- X86嵌入式主板在IOT网关产品的应用
- [转]Redis持久化存储(AOF与RDB两种模式)
- 安装应用程序时,提示以前的某个程序安装挂起的解决方法
- POJ 1163 The Triangle
- 详细讲解 委托和事件
- cmd切换为administrator用户
- web测试和一般的应用程序测试的主要区别
- Star Schema完全参考手册读书笔记三
- 怎样用一份数据透视表打动老板
- NetscalerSSL证书的导入和link
- Microsoft SQL Server Integration Service文章总结
- python通信工程定额_通信工程2008版定额和2017版定额简单对比
- 产品经理必读书单(2019史上最全)
- 网页回拨-Web CallBack
- matlab心碎的心,让人撕心裂肺的心痛网名,心碎绝望的伤感昵称
- 在三人易行学习PLC编程有什么好处?
- Flutter基础之部分控件学习
- win10 metro app(应用商店中的APP)如何走代理?
- Unity点击物体后,移动到物体所在位置
热门文章
- [464]Outlook如何备份邮件
- 上传图片时获取图片的宽高度
- 推荐一个批量群控N台远程桌面的效率工具-黑马远程桌面5.12版
- 中国最早的计算机汉字系统,1983年10月,中国王永民发明了( )汉字输入法,计算机汉字输入问题得到根..._考试资料网...
- CRM实施能给客户带来什么好处
- centos8 + kubernetes 1.24 master/node 节点
- RabbitMQ 的使用场景有哪些?
- C++虚继承中的虚基类表
- java jdk1.9下载
- 珊瑚虫论坛版主自建网站声援珊瑚虫QQ