Ubuntu下Qt资源和文件加密(图片和qml)
Qt资源和文件在windows下编译后可以直接生成exe文件,但是在Ubuntu下,特别是Qt中的图片和qml资源都被当成资源文件,如果不加密就相当于直接把原始代码公布于众,这样是极不安全的。
最好的办法就是实现资源和源码分离,而Qt正好有rcc命令,可以把资源文件实现整合和加密,虽然不知道加密破解难度几级,但是聊胜于无吧。毕竟跟门锁一样防君子不防小人。
我们大家都知道,在qt框架中,资源文件后缀名是以.qrc结尾的。它可以将我们的图片文件、qml、与样式表文件等装进可执行程序中。我们将怎样做呢?一般情况下,我们在Qt Creator项目右键添加新文件,选择Qt Resource File。之后输入名字,项目中就有资源管理文件了。
.qrc文件里是以xml格式管理资源文件的,如下
<RCC>
<qresource prefix="/images">
<file alias="icon">images/logo.ico</file>
<file alias="title">images/title.png?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzYw,t_20</file>
<file alias="closeBtn">images/gb1.png?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzYw,t_20</file>
</qresource>
<qresource prefix="/qss">
<file alias="stylesheet">stylesheet.qss</file>
</qresource>
<qresource prefix="/SearchItem">
<file alias="SearchItemFile">SearchItem/SearchItemColor.dat</file>
</qresource>
</RCC>这里面有三种文件:图片(图标)、.qss(样式表)、.dat文件格式。
使用的时候我们有两种方式:
:/images/title.png?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzYw,t_20
qrc:///images/title.png?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzYw,t_20 </span>假设这时候,我们的程序只需要换个皮肤(图标),那么我们怎么办呢?只能是打开源码,将qrc文件里的图标换掉,然后重新编译,最后才能生成新的可执行文件。 显然这是比较麻烦的。这样还容易被别人恶意篡改图片,造成很不好的影响。
为了更好地保护我们的图片安全,我们应该尽可能的将项目的功能源码与资源文件分离开来,如果只是改变图标之类的改变,就不需要重新编译源代码了。具体我们该怎样做呢?
1.使用QT Creator 新建一个资源文件.qrc。这时候,这个资源文件并不是属于任何项目的。
2.在.qrc存放的目录下新建images文件夹(用于存放项目所有的图片)与styleSheet文件夹(用于存放样式表文件.qss)。
3.用qt creator打开resource.qrc,然后将images文件夹与qss文件夹里的所有文件添加到qrc文件里。
4.使用rcc 命令将resource.qrc生成.rcc二进制文件。
rcc --binary resource.qrc -o skin.rcc至此,我们的资源文件已经分离开并且已经做成了二进制文件。那么程序中怎样使用的呢?
5.在项目的可执行目录下新建skin文件夹。将生成的skin.rcc放到skin文件夹里。
6.在qt程序启动的时候,加载一下资源文件
QResource::registerResource(qApp->applicationDirPath() + "/skin/skin.rcc");
QFile file(":/qss/stylesheet");
if(file.open(QFile::ReadOnly))
{
QString strStyleSheet = file.readAll();
file.close();
qApp->setStyleSheet(strStyleSheet);
}在Qt for python中,需要导入
from Pyside2.QtCore import QResource
QResource.registerResource(Path)然后就可以在qml中直接使用资源和qml文件了