1、相关文章

Qt 资源系统
qt的moc,uic,rcc命令的使用

2、概要
    毕业两年了,一直使用的是qt界面库来开发程序,使用过vs08、10、13等开发工具,并安装了qt的插件,最近在做客户端换肤功能,所以就对qt的qrc做了点儿研究,我是一个实干派(可能有点儿虚),相对于看文档来说。本文开头我就给出了两篇博客,这两篇博客对我理解qrc这个东西有很大的帮助,接下来我就简单分析下我的理解。

首先说明下qrc是qt的东西,而不属于vs,这也很容易证明,那就是vs的工程师不识别qrc文件的,如果需要使用qrc文件,那么是需要我们手动新建一个txt,然后改后缀并添加到vs工程里。添加到vs工程里的qrc文件如果我们要打开它,可以qt自带的qt resource editor,如图1所示。而我们使用qrc也有多种方式,本文中会提及到两种方式(不知道还有第三种没),一种是把qrc文件使用rcc编译成qrc_xxx.cpp文件,这个文件以静态的C++压缩二进制数组包含了所有图片和其他资源的数据;另一种是把qrc文件用rcc编译成rcc二进制文件(rcc -binary r.qrc -o r.rcc).

图1

3、换肤理解
    铺垫了qrc的东西后,我先说说我对换肤的理解,可能有失偏颇,但总归是个人见解,大牛勿喷。
    qt程序换肤,个人理解可以从这两点来修改:rgb+png,咋一看似乎不能理解,其实也挺好理解,接下来我就说下我自己的换肤过程
rgb替换
    所谓rgb替换就是单纯的颜色替换,这个也可能是我们大多数人都会使用的一种换肤。其实原理很简单,就是把所有的stylesheet描述都拿出来,然后放到一个qss文本文件中,把这个文件添加到qrc文件中,qrc中的内容最终会被编译成二进制数据供我们程序使用,编译的方式就是前文中提及到的两种方式。
加载qss文件并使用到全局代码如下:

 QFile file(filename);
if (!file.open(QFile::ReadOnly))
{
return;
} QTextStream in(&file); in.setCodec("UTF-8");
QString qss = in.readAll(); qApp->setStyleSheet(qss);

上边这个方法的参数就是qss文件在qrc中的资源路径,可以使用该方法随时进行rgb换肤。

关于rgb换肤,在写代码时我也给出了一下建议
1、使用setStyleSheet的过程中不能和逻辑代码一起
2、每个gui类只使用1次setStyleSheet,所有的设置都尽可能的放在构造函数中,方便以后查找
3、考虑到每个可能需要换肤的widget,都需要使用setObjectName方法为其命名,并且名称不能和其他控件名称重复
4、使用setStyleSheet方法时,注意格式,建议格式为:class#objectname{}
    当然了了解qss语法之后,你会发现第四种方式只是比较简单的类选择器,如果对qss语法比较熟悉的也可以使用更高级的方式,如图2所示,是一个qss文件示例

图2

说到qss的语法,我这儿给出一个qss的坑:当类属性发现变化时需要重置qss,qt qss博文中也有相应的说明,虽然这篇博客是我转的,但是其中有加入我自己的理解。
关于qss风格重置我写了一下共有方法

 void ResetStyleSheet(QWidget * widget)
{
QString sheetStr = widget->styleSheet();
widget->setStyleSheet("");
widget->setStyleSheet(sheetStr);
}

图片资源替换
图片资源替换我只给出我自己的测试结论,关于更理论的知识可以参考我给出的第一篇文章
方式1:把qrc打到dll中,这种在使用vs的时候是比较简单的,只需要把qrc加入到vs工程就可以了。
方法2:把qrc编译成rcc文件,使用rcc命令:rcc -binary r.qrc -o r.rcc

4、不管是使用哪一种方式,一下四个方法都是很有用的
Q_INIT_RESOURCE(filename);//加载一个qrc文件
Q_CLEANUP_RESOURCE(filename);//清理一个qrc文件,使用vs方式加载的qrc文件,可以使用这种方式清理
QResource::registerResource("filename.rcc");//注册一个rcc文件,该文件是用qrc文件编译而成,结果和Q_INIT_RESOURCE一样
QResource::unregisterResource("filename.rcc");//反注册一个rcc文件,结果和Q_CLEANUP_RESOURCE一样

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

 

很重要--转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

qt之窗口换肤的更多相关文章

  1. qt之窗口换肤(一个qss的坑:当类属性发现变化时需要重置qss,使用rcc资源文件)

    1.相关文章 Qt 资源系统qt的moc,uic,rcc命令的使用 2.概要    毕业两年了,一直使用的是qt界面库来开发程序,使用过vs08.10.13等开发工具,并安装了qt的插件,最近在做客户 ...

  2. QT自定义精美换肤界面

    陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数次,一直搜索QT相关的换 ...

  3. Qt编写可换肤的中文双拼汉字输入法

    时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...

  4. Qt之界面换肤

    简述 常用的软件基本都有换肤功能,例如:QQ.360.迅雷等.换肤其实很简单,并没有想象中那么难,利用前面分享过的QSS系列文章,沃我们完全可以实现各种样式的定制! 简述 实现原理 效果 新建QSS文 ...

  5. 基于QT的换肤整体解决方案(QSkinStyle)(提供Linux的XP风格)

    基于QT的换肤整体解决方案(QSkinStyle) 对QT这个成功的跨平台GUI库,本身内置了对换肤功能的实现,比如cleanlooks.plastique等跨平台风格:还有一些是和平台相关的风格,比 ...

  6. C# Winform中窗体的美化—— 用IrisSkin轻松实现换肤功能

    今天经前辈提醒才知道winform窗体还有美化工具,呵呵,不得不说,孤陋寡闻了.下面总结一下irisskin2的使用步骤和遇到的问题及解决办法. 1.网址:http://www.pc6.com/sof ...

  7. javascript进行百度换肤 和显示隐藏一个窗口的操作

    简单的运用javascript来进行百度换肤的操作 <!DOCTYPE html> <html lang="en"> <head> <me ...

  8. c# winform使用IrisSkin2换肤弹不出窗口解决方案

    winform使用IrisSkin2换肤弹不出窗口解决方案 这张图能解决超级多博友的问题,知识是共享的,绝不私吞.共同学习,共同进步! 不需要说太多,只需1张图!                    ...

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

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

随机推荐

  1. SSH免密登录实现

    现在先想要把项目部署到linux系统中 通过使用maven添加tomcat插件可以做到,右击项目 配置这里的url,是部署到哪里的意思(比如我们现在将这个项目部署到以下系统的tomcat中) 此处只有 ...

  2. hashTabel List 和 dic

    hashTabel  List  和 dic 原:https://www.cnblogs.com/jilodream/p/4219840.html .Net 中HashTable,HashMap 和 ...

  3. Laravel修改验证提示信息为中文

    1.覆盖提示信息: 打开resource/lang/en/validation.php注释掉英文提示信息 $ sudo vim resource/lang/en/validation.php 将下面的 ...

  4. VS2013+ffmpeg开发环境搭建

    VS2013+ffmpeg开发环境搭建 转 https://blog.csdn.net/u014253332/article/details/86657868 一.准备ffmpeg相对应开发dll.i ...

  5. 2019-3-22c# TextBox只允许输入数字,禁用右键粘贴,允许Ctrl+v粘贴数字

    TextBox 禁止复制粘贴 ShortcutsEnabled =false TextBox只允许输入数字,最大长度为10 //TextBox.ShortcutsEnabled为false 禁止右键和 ...

  6. 关闭或启动linux防火墙后,docker启动容器报错

    # docker启动报错   # 解决办法:重建docker0网络恢复   #按照进程名杀死docker进程 [root@localhost mysqlconf]# pkill docker #清空防 ...

  7. Response输出excel设置文本样式

    在网上查了些Response导出excel然后设置样式的方法,发现没有一个可行的于是开始自己研究, 发现可以通过输出样式的方式进行配置,我要设置的是全文本格式在excel样式是这样的mso-numbe ...

  8. windows本地用户及组的区别

    Administrators(超级管理员组) 用来管理注册用户或者具有一定权限的其他管理员,维护网站的运行. Administrators中的用户对计算机/域有不受限制的完全访问权,分配给该组的默认权 ...

  9. vue项目开发基本目录结构

    § 目录结构 . ├── build/ # Webpack 配置目录 ├── dist/ # build 生成的生产环境下的项目 ├── src/ # 源码目录(开发都在这里进行) │ ├── ass ...

  10. Java for Andriod 第二周学习总结

    第四章 学习时遇到的问题或新知识点: 1. 构造方法.每个类至少有一个构造方法,且构造方法必须的名称必须与类名相同. 2. Varargs.允许方法拥有一个可变长度的参数列表. 3. 对象的内存分配. ...