【Qt学习】QIcon类 + 利用qrc机制设置图片路径(QtCreator)

本文详细介绍了QIcon在Qt中的应用,区分QIcon()和setWindowIcon()的区别,讨论了绝对路径和相对路径的问题,并重点讲解了qrc机制如何管理和打包资源文件,包括在QtCreator中的操作步骤。

1. QIcon / windowIcon

QIcon

  • QIcon 是Qt 框架中的一个类,用于表示图标。它可以加载各种格式的图像文件,并用于在 Qt 应用程序中显示图标。

  • 使用 QIcon 类,可以将图标设置为窗口标题栏、工具栏按钮、菜单项等控件的图标

windowIcon

windowIcon,即应用程序 窗口的图标,有以下两接口:

API说明
windowIcon()获取控件的图标,并返回QIcon对象
setWIndowIcon()设置控件的窗口图标

2. setIcon() 与 setwindowIcon()

2.1 setIcon() 介绍与使用

  • setIcon() 是用于 设置窗口部件(如按钮、标签等)的图标。它可以将一个 QIcon 对象设置为窗口部件的图标,用于在界面中显示该部件的图标。

示例:

在下面的例子中,我们将下面的图标设置到按钮上:

在这里插入图片描述

QPushButton *button = new QPushButton(this);
QIcon icon("D:\\Coder\\pictures\\icons\\camera");
button->move(100, 100);
button->setIcon(icon);

在这里插入图片描述

通过 setIcon() 设置的图标将会显示在指定的窗口部件上。


2.2 setWindowIcon 介绍与使用

  • setWindowIcon() 是用于 设置顶级窗口(如主窗口、对话框等)的图标。它可以将一个 QIcon 对象设置为顶级窗口的图标,用于在窗口的标题栏、任务栏等位置显示该图标。

示例:

QMainWindow *window = new QMainWindow(this);
QIcon icon("D:\\Coder\\pictures\\icons\\camera");
window->setWindowIcon(icon);
window->show();

在这里插入图片描述

通过 setWindowIcon() 设置的图标将会显示在窗口的标题栏、任务栏等位置。


3. 路径问题 & qrc机制的引入

3.1 绝对路径 / 相对路径 的问题

首先简单提一点:

  • 图标文件路径应该是正确的,否则图标可能无法加载。图标文件路径,我们有两种选择:
  • 使用转义符号\\正斜杠/来表示路径分隔符,因为反斜杠可能被解释为转义字符

对于上面举的两例:

  • 我们所使用的路径是绝对路径,即开发机上的路径。
  • 而程序最终要打包给用户使用,绝对路径显然是没法正确将图片设置出来。
  • 而优于绝对路径,我们可以选用相对路径,如果将图片放到程序根目录或子目录中,使用时直接搜索,但依然面临问题,如果用户无意把图片删掉,那么程序最终执行依然会缺少相应资源。
  • 此时我们引入qrc机制

3.2 qrc机制

概念

  • 首先,qrc机制可以确保不会出现上述的两个问题,可以确保:
    1. 图片所在的路径一定会在用户机器存在。
    2. 片不会被用户删掉。
  • qrc机制 用于将资源文件嵌入到应用程序中
    • 通过使用qrc机制,开发人员可以将图像、字体、样式表和其他资源文件作为二进制数据打包到应用程序中,而无需将它们作为外部文件进行管理。

原理

  1. QRC机制使用特殊的URL格式来引用资源文件。所有资源文件的路径都是相对于QRC文件本身的。

  2. 给Qt项目 引入一个xml文件(以.qrc为后缀),将要使用的资源文件导入到xml文件中并记录

  3. Qt在项目编译时,会根据qrc中的图片信息,提取图片的二进制信息,并将二进制数据转换为代码,最终写入到exe中

缺点

  • qrc机制的缺点:无法导入过大的资源文件

3.3 在QtCreator下利用qrc机制引入图片

我们在当前Qt项目中 添加Qt资源文件,如下图所示:

在这里插入图片描述

首先添加前缀(即文件路径),随后在所添加的qrc文件中添加文件:

在这里插入图片描述

需要注意的是,添加的资源文件一定要在res.qrc文件的同级目录或子目录。

添加文件后,如下:

在这里插入图片描述
此时我们执行下面的代码,会有如下结果:

在这里插入图片描述

如上图所示,窗口的图标被正确的改变了\

4. 代码资源

文章所涉及的代码等点这里👇

QIcon类的使用:设置窗口图标

### 可能的原因分析 在Qt项目中,如果使用`QIcon`加载图片资源失败并导致运行时无法显示图片,可能涉及以下几个方面: 1. **qrc文件配置错误** 如果`.qrc`文件未正确添加到项目的资源系统中,则可能导致程序找不到对应的图片资源。确保.qrc文件已正确添加至工程,并通过Qt Creator将其纳入构建过程[^1]。 2. **路径问题** 使用相对路径加载图片时,需注意当前工作目录的位置。默认情况下,编译运行时的工作目录为`main.cpp`所在的路径。因此,当使用相对路径(如`"./Resources/Icon/Stop.png"`)时,应确认该路径相对于可执行文件的实际位置是否有效。 3. **资源前缀问题** 当使用`:/{prefix}/{path}`的形式访问资源时,必须确保`.qrc`文件定义的前缀与代码中的调用一致。例如,若`.qrc`文件中有如下声明: ```xml <RCC> <qresource prefix="/images"> <file>config.png</file> </qresource> </RCC> ``` 则应在代码中以`:./images/config.png`的方式访问资源[^2]。 4. **编译器或工具链问题** 若`.qrc`文件未能被正确处理成`qrc_xxx.cpp`,则可能导致运行时缺少必要的二进制数据。这可能是由于以下原因引起的: - `.qrc`文件未正确关联到`.pro`文件中。 - 构建过程中遗漏了资源文件的更新操作。 --- ### 解决方法 #### 方法一:检查资源文件配置 确保`.qrc`文件已被正确添加到`.pro`文件中。例如: ```plaintext RESOURCES += \ resources.qrc ``` 如果没有此条目,请手动添加。随后重新运行`qmake`以刷新构建脚本。 #### 方法二:验证路径一致性 对于静态资源文件,推荐使用绝对路径方式加载,即以冒号开头的路径形式。例如: ```cpp QIcon icon; icon.addFile(QStringLiteral(":/Images/Icons/Stop.png"), QSize(), QIcon::Normal, QIcon::Off); ui->m_pTbtnRefreshFrame->setIcon(icon); ``` #### 方法三:清理重建项目 有时,旧的缓存可能会干扰新资源的加载。建议删除之前的构建产物并重新构建整个项目。具体步骤包括: - 删除`build-*`目录下的所有内容。 - 执行`qmake && make`命令(Linux/MacOS),或者在Visual Studio中选择“Clean Solution”后再“Rebuild Solution”。 #### 方法四:调试资源加载状态 可以通过打印日志来判断图标是否成功加载。例如: ```cpp QString path = QStringLiteral(":/Images/Icons/Stop.png"); if (QFile::exists(path)) { qDebug() << "Resource exists:" << path; } else { qDebug() << "Resource does not exist:" << path; } ``` 上述代码可以帮助定位是否存在路径匹配问题。 --- ### 示例代码 以下是完整的示例代码片段,展示如何正确加载资源文件中的图片作为`QIcon`对象: ```cpp #include <QApplication> #include <QPushButton> #include <QIcon> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button("Click Me!"); QIcon icon; icon.addFile(QStringLiteral(":/Images/Icons/Stop.png"), QSize(), QIcon::Normal, QIcon::Off); if (!icon.isNull()) { // 验证图标是否为空 button.setIcon(icon); } else { qDebug() << "Failed to load icon!"; } button.show(); return app.exec(); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值