qrc文件本身内容是个xml文件,如下所示:
<RCC>
<qresource prefix="/QtInstallVS2017">
<file>Resource/Install20220821.zipfile>
qresource>
RCC>
实际上,它有许多规则,如何简单使用?可以用qrceditor.exe这个软件来编辑。下载路径。
将Qt Bin所在路径临时添加入系统PATH目录,脚本如下所示:
Set PATH=%PATH%;E:\OpenSource\QT\vs2017Qt\Qt5_9_2_VS2017_Static_64\bin
将qrc文件转为二进制文件,代码如下所示:
rcc -binary QtInstallVS2017A.qrc -o QtInstallVS2017A.rcc
rcc -binary QtInstallVS2017.qrc -o QtInstallVS2017.rcc
打包之后的资源如何使用,需要在程序中注册。如果与项目默认文件名一致,会打包到exe文件,且不需要注册。
bool rlt=QResource::registerResource("QtInstallVS2017A.rcc");
if (rlt) {
QFile file(":/File/Install20220821.zip"); //":/前缀/文件名"
if (file.open(QIODevice::ReadOnly)) {
int k = 0;
}
}
注意:资源文件放在项目所在目录,而不是解决方案所在目录。
在Qt中使用内置的压缩和解压模块,需要在模块中加载gui-private,如下图所示:
然后非常简单就能解压文件,如下所示:
#include "QtGui/private/qzipreader_p.h"
#include "QtGui/private/qzipwriter_p.h"
//解压文件到文件夹
QZipReader reader(srcZipFilename);
reader.extractAll(dstFolder);
将文件夹压缩为zip文件。代码如下所示:
#include "QtGui/private/qzipreader_p.h"
#include "QtGui/private/qzipwriter_p.h"
#include
#include
#include
#include
#include
static bool QZipWriterEx(QZipWriter *writer, QString tmpPath, QString basePath)
{
QDir dir(tmpPath);
QFileInfoList fil = dir.entryInfoList();
foreach(QFileInfo info, fil)
{
if (info.fileName() == "." || info.fileName() == "..")
continue;
if (info.isFile())
{
QFile upfile(info.filePath());
upfile.open(QIODevice::ReadOnly);
QString fileName = info.filePath().mid(basePath.size() + 1, info.filePath().size());
writer->addFile(fileName, upfile.readAll());
//qDebug() << fileName << tmpPath << basePath;
upfile.close();
}
else if (info.isDir())
{
QZipWriterEx(writer, info.filePath(), basePath);
}
}
return true;
}
//SavePath:压缩到的文件名;dirPath:需要压缩的目录。
static bool zipDir(const QString& srcFolder, QString dstZipFilename)
{
bool ret;
QZipWriter *writer = new QZipWriter(dstZipFilename);
if (QZipWriterEx(writer, srcFolder, srcFolder))//dirPath为了方便回调,所以传了两次。
ret = true;
else
ret = false;
writer->close();
delete writer;
return ret;
}
static void Test() {
QString srcFolder = QString::fromLocal8Bit("C://Users//ajz//Desktop//新建文件夹 (2)");
QString dstZipFile = QString::fromLocal8Bit("C://Users//ajz//Desktop//test.zip");
zipDir(srcFolder, dstZipFile);
}
A.解决fatal error C1060: 编译器的堆空间不足(详解) 这句话的意思就是,指定VS使用64位编译器cl.exe来进行编译,这样编译时,可访问内存将达到4GB以上,便不会报错了。 如有疑问,敬请留言。
常见的是由于定义了大量静态全局数组,编译时导致编译器占用内存超出该编译器程序可访问范围。打开xxx.vcxproj工程文件,搜索“Globals”在文件中找到<PreferredToolArchitecture>x64PreferredToolArchitecture>
6.作者答疑