QT中添加的资源文件qrc时的路径问题小结

本文详细介绍了如何在QT应用程序中添加并使用资源文件,包括资源文件的编译过程、使用限制及注意事项,例如如何处理不同编码格式的文本文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设向一个QT的应用程序里添加了资源文件(icon.qrc),然后有在里面添加了下面的内容:

<RCC>
    <qresource prefix="/image">
        <file>image/DIW.ico</file>
    </qresource>
    <qresource prefix="/text">
        <file>text/1.cpp</file>
    </qresource>
</RCC>

看起来向下面的样子:


如果引用上述资源文件里的【1.cpp】,文件的路径应该是“:/text/text/1.cpp”,而不是“:/text/1.cpp”

为什么?不必追问太多,直接到编译后形成的文件“qrc_icon.cpp”里找答案吧:


看到qrc_icon.cpp”文件里的内容,有这么几点认识:

① 所添加的各种资源文件,最终被编译成unsigned char,放到字节数组qt_resource_data[]里了;

② 既然这些内容是在编译时已经创建,因此只能做“读”操作,如QFile::open(QIODevice::ReadOnly),而不能做写操作;

③ 每次改动外部被添加资源文件的内容,需要重新编译;

④ 当要使用外部资源文件为文本内容时,注意该文件的编码格式,可以使用常用的文本编辑器notepad++查看当前格式,在QT里要正确显示,或者为系统设置编码格式:

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

或者在需要使用的地方,使用明确的编码格式,如下面的QString result字符串:

void MainWindow::readResult(int exitCode)
{
    if(exitCode == 0) {
#if defined(Q_OS_WIN32)
        QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
        QString result = gbkCodec->toUnicode(p->readAll());
#elif defined(Q_OS_LINUX)
        QTextCodec* utfCodec = QTextCodec::codecForName("UTF-8");
        QString result = utfCodec->toUnicode(p->readAll());
#endif
        QMessageBox::information(this, "dir", result);
    }
}

其他如“utf8”格式,总之要和文本文件的编码格式一致。

⑤ 可以将":/"传递到QDir中,枚举其下的文件内容,如下:

    QDir d(":/");
    qDebug()<<"absolutePath: "<<d.absolutePath();
    qDebug()<<"dirName: "<<d.dirName();
    foreach (QFileInfo info, d.entryInfoList())
    {
       qDebug()<<"absoluteDir: "<<info.absoluteDir();
       qDebug()<<"absoluteFilePath: "<<info.absoluteFilePath();
       qDebug()<<"absolutePath: "<<info.absolutePath();
       //.....其他内容
    }




<think>我们正在处理如何在Qt资源文件(qrc)中创建和添加有层级的文件夹的问题。根据引用[1],我们知道在QtCreator中可以通过创建qrc文件并编辑它来管理资源。引用中提到了两种编辑方式:资源编辑器和文本编辑器。层级结构的文件夹在qrc文件中实际上是通过前缀(prefix)来模拟的。在资源管理器中,我们可以通过创建前缀(类似于文件夹)来组织资源文件。具体步骤如下:1.创建qrc文件(如果还没有):在QtCreator中,右击项目->添加新文件->选择“QtResourceFile”->输入文件名并创建。2.编辑qrc文件:我们可以使用资源编辑器(图形界面)或文本编辑器(手动编辑)来添加层级结构。a.使用资源编辑器:-在项目视图中右击qrc文件,选择“OpenWith”->“资源编辑器”。-在资源编辑器中,点击“添加前缀”按钮(或右击选择“添加前缀”),输入前缀名(例如:/images/backgrounds)。-然后选择这个前缀,点击“添加文件”或“添加目录”按钮来添加资源文件。注意:添加目录,可以选择是否递归添加子目录。*注意:前缀中的斜杠表示层级,例如:/images/backgrounds表示在根目录下有images文件夹,其中包含backgrounds文件夹。b.使用文本编辑器(直接编辑XML内容):-在项目视图中右击qrc文件,选择“OpenWith”->“普通文本编辑器”。-qrc文件的基本结构是XML。例如:<RCC><qresourceprefix="/images"><file>backgrounds/blue.png</file></qresource></RCC>但是这样并没有创建多级前缀,而是将文件放在一个前缀下,并且文件路径中包含了子目录。如果我们想要多级前缀(即多个层级的虚拟文件夹),可以这样:<RCC><qresourceprefix="/"><file>images/backgrounds/blue.png</file></qresource></RCC>或者,如果我们想为不同层级设置不同的前缀,可以:<RCC><qresourceprefix="/images"><file>backgrounds/blue.png</file></qresource><qresourceprefix="/images/backgrounds"><file>pattern.png</file></qresource></RCC>但通常我们使用一个前缀,然后在文件路径中体现层级。更常见的做法是:<RCC><qresourceprefix="/"><file>images/backgrounds/blue.png</file><file>images/backgrounds/pattern.png</file><file>images/icons/home.png</file></qresource></RCC>这样,在资源系统中,我们就会看到:/images/backgrounds/blue.pngpattern.pngicons/home.png也就是说,在qrc文件中,通过文件路径的斜杠分隔,自然形成了层级结构。3.添加具有层级结构的文件夹:在资源编辑器中,我们可以通过以下步骤添加整个文件夹(包含子文件夹):-在资源编辑器中,先选择或创建一个前缀(比如前缀为`/`,即根目录)。-然后点击“添加目录”按钮,选择磁盘上的一个目录(例如:`images`目录,该目录下可能有子目录backgrounds和icons)。-在弹出的对话框中,选择“添加文件”选项,并勾选“递归添加目录”(这样会包含子目录)和“添加空目录”(如果需要的话)。-确定后,资源编辑器会将整个目录结构添加qrc文件中。在文本编辑器中,我们可以手动编写文件路径,或者使用通配符来添加整个目录(但注意,通配符在qrc文件中是允许的):<RCC><qresourceprefix="/"><file>images/backgrounds/*.png</file><file>images/icons/*.png</file></qresource></RCC>但是这样不会保留子目录结构,而是将匹配的文件都放在同一个前缀下。为了保留子目录结构,我们可以使用:<RCC><qresourceprefix="/"><file>images/backgrounds/</file><!--这样不行,不能添加整个目录--></qresource></RCC>实际上,qrc文件不支持直接添加整个目录(而不指定具体文件),但我们可以使用通配符来添加目录下的所有文件(包括子目录):<RCC><qresourceprefix="/"><file>images/*</file><!--这样会添加images下的所有文件,但不包括子目录--></qresource></RCC>为了包括子目录,我们需要使用递归通配符(**):<RCC><qresourceprefix="/"><file>images/**/*.png</file><!--递归添加images目录下所有子目录中的png文件--></qresource></RCC>这样,在资源系统中,将保留原来的目录结构。总结:在qrc文件中创建层级结构有两种主要方式:-通过文件路径中的斜杠来自然形成层级(例如:`images/backgrounds/blue.png`)。-通过多个前缀来创建不同的层级(但通常不推荐用多个前缀来模拟多级目录,因为这样管理起来可能更复杂)。使用资源编辑器添加整个目录(包括子目录),会自动保留目录结构。手动编辑,可以使用通配符(特别是递归通配符)来添加整个目录树。注意:在代码中访问资源路径是带前缀的。例如,如果文件在qrc中显示为`:/images/backgrounds/blue.png`,则我们可以使用这个路径来加载。引用[2]提到了将qrc文件转换为Python源文件的命令(pyrcc5),这在使用PyQt是必要的步骤。转换后,资源文件会被编译进Python模块中,访问方式不变。引用[3]提到了Android开发中资源文件的处理,但我们的问题集中在Qt资源文件上,因此可以忽略。因此,具体操作步骤(使用资源编辑器):1.创建qrc文件(如果还没有)。2.打开资源编辑器(在qrc文件上右击选择“OpenWith”->“资源编辑器”)。3.添加一个前缀(比如`/`,根前缀,也可以自定义)。4.点击“添加目录”,选择磁盘上的文件夹(例如:`my_resources`),勾选“递归添加目录”和“添加空目录”(如果需要),然后确定。5.保存qrc文件。这样,在资源编辑器中,你会看到以`my_resources`为根的目录结构(在qrc文件中,这些文件会以相对路径的形式出现,并且保留目录结构)。如果使用文本编辑器,可以这样写(假设我们有一个`my_resources`目录,位于项目目录中,里面包含多级子目录和文件):<RCC><qresourceprefix="/"><file>my_resources/images/backgrounds/blue.png</file><file>my_resources/images/backgrounds/pattern.png</file><!--或者使用通配符--><file>my_resources/images/**/*</file></qresource></RCC>但是手动列出每个文件很麻烦,所以通常使用资源编辑器添加整个目录,或者使用通配符(注意通配符的递归使用)。注意:使用通配符Qt在编译资源会将匹配的文件都添加进来,所以确保通配符不会匹配到不需要的文件。最后,记得在代码中访问资源使用正确的路径(如:`":/my_resources/images/backgrounds/blue.png"`),其中前缀`/`被替换为`:`,然后接上文件在qrc中的路径。完成上述步骤后,层级结构的文件夹就被添加到了qrc资源文件中。</think>### 在 Qt 资源文件(qrc)中创建层级文件夹的方法 在 Qt 资源文件(qrc)中创建层级结构可以通过以下两种方式实现: #### 方法 1:使用 Qt Creator 资源编辑器(推荐) 1. **打开资源编辑器** 在项目视图中右击 `.qrc` 文件 → 选择 "Open With" → "Resource Editor"[^1] 2. **创建前缀(模拟文件夹层级)** - 点击左上角 **"添加前缀"** 按钮(或右键空白处选择) - 输入前缀路径(如:`/images/backgrounds`),斜杠 `/` 表示层级分隔 ```xml <!-- 生成的结构 --> <qresource prefix="/images/backgrounds">...</qresource> ``` 3. **添加文件到层级** - 选择创建的前缀 - 点击 **"添加文件"** 或 **"添加目录"** - 勾选 **"递归添加目录"** 保留子文件夹结构 #### 方法 2:手动编辑 .qrc 文件(直接修改 XML) ```xml <RCC> <!-- 第一级目录 --> <qresource prefix="/icons"> <file>toolbar/save.png</file> </qresource> <!-- 第二级目录 --> <qresource prefix="/docs/manuals"> <file>user_guide.pdf</file> </qresource> <!-- 带子目录的结构 --> <qresource prefix="/"> <file>assets/textures/wood.png</file> <file>assets/sounds/click.wav</file> </qresource> </RCC> ``` **关键点**: - 使用 `<qresource prefix="路径">` 定义虚拟文件夹 - 文件路径中的 `/` 会自动创建层级(如 `assets/textures/`) - 根目录使用 `prefix="/"` #### 层级访问示例(代码中引用) ```cpp // 访问 /icons/toolbar/save.png QIcon saveIcon(":/icons/toolbar/save.png"); // 访问 /docs/manuals/user_guide.pdf QFile manual(":/docs/manuals/user_guide.pdf"); // 访问 /assets/textures/wood.png QPixmap woodTex(":/assets/textures/wood.png"); ``` ### 注意事项 1. 资源编译,文件路径中的目录分隔符必须使用 **正斜杠 `/`**(即使 Windows 系统) 2. 添加整个目录勾选 **"递归添加"** 保留子文件夹结构[^1] 3. 资源路径在代码中始终以 `:/` 开头(如 `:/images/logo.png`) 4. 修改后需 **重新构建项目** 使更改生效 > 通过合理设计前缀路径和文件位置,可以实现任意深度的资源层级管理。实际目录结构不会物理创建,Qt 资源系统会虚拟映射这些路径[^1][^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值