无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像

Posted

技术标签:

【中文标题】无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像【英文标题】:Can not load image specified in Qt resource file in Qt5/cmake Project 【发布时间】:2013-08-21 14:24:31 【问题描述】:

我刚刚开始使用 cmake 作为构建系统的 Qt5 项目。到目前为止,这工作得很好,但是我想从 qrc 文件加载图标时遇到问题。

项目结构:

CMakeLists.txt
-- icons/
   CMakeLists.txt
   icons.qrc
   locked.png
-- src/
   CMakeLists.txt
   source files...

*** CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.11) #2.8.11 provides an easy way to build with qt5
project(fluchOmat)

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

# Find the QtWidgets library. This has dependencies on QtGui and QtCore!
find_package(Qt5Widgets REQUIRED)
# Find the QtMultimedia module
find_package(Qt5Multimedia REQUIRED)

add_subdirectory(icons)
add_subdirectory(src)

图标中的 CMakeLists.txt/

set(RESOURCE
    $CMAKE_CURRENT_SOURCE_DIR/icons.qrc
)

qt5_add_resources(RESOURCE_ADDED $RESOURCE)

icons/中的icons.qrc

<RCC>
    <qresource prefix="/">
        <file alias="locked">locked.png</file>
    </qresource>
</RCC>

src/中的CMakeLists.txt(重要部分)

add_executable(fluchOmat $SOURCES $HEADERS $fluchOmat_FORMS $RESOURCES_ADDED)

一些示例代码

QPixmap pm(":/locked.png");
qDebug("Width: " + pm.width());

什么都不返回,所以显然这不起作用。

Qt5 和 cmake 的资源并不多。谁能帮我这个?这是一个cmake问题吗?例如,我不确定 qt5_add_resources 是否在正确的位置。我的qrc文件错了吗?

非常感谢任何帮助!

【问题讨论】:

由于你的图片文件在资源中有别名,如果你使用 QPixmap(pm(":/locked"); 没有文件扩展名,它仍然会失败吗? 是的,使用别名也有同样的问题。 嗯,资源文件和图像请求看起来不错,所以我认为问题在于 cmake 如何包含资源文件。 【参考方案1】:

问题在于 CMake 的范围规则。每个add_subdirectory 调用都会创建自己的范围。在此类子目录中声明的变量不会自动填充到父范围。

所以问题是,虽然RESOURCE_ADDED 包含图标/CMakeLists.txt 范围内的有效路径,但它不在根 CMakeLists.txt 中,因此在您使用它时它是一个空变量src/CMakeLists.txt.

要将变量提升到一个范围,您可以在 icons/CMakeLists.txt 中执行以下操作:

qt5_add_resources(RESOURCE_ADDED $RESOURCE)
set(RESOURCE_ADDED $RESOURCE_ADDED PARENT_SCOPE)

不过现在还有一个小问题!

虽然这将在 src/CMakeLists.txt 中包含一个有效值,但它指向一个尚不存在的文件。 qt5_add_resources 函数必须将GENERATED 源文件属性应用于变量。该属性不会结转到父作用域中设置的变量。

由于add_executable 期望文件默认存在,您需要将GENERATED 属性重新应用到父作用域中的变量。你可以这样做,例如在 src/CMakeLists.txt 中像这样:

set_source_files_properties($RESOURCE_ADDED PROPERTIES GENERATED ON)
add_executable(fluchOmat ... $RESOURCE_ADDED)

我不确定qt5_add_resources 是否添加了任何其他属性 - 如果是,您可能还需要重新应用这些属性。

我猜想避免这种情况的最简单方法是不使用add_subdirectory(icons),而是将所有与 Qt 相关的 CMake 代码移动到 src/CMakeLists.txt:

set(RESOURCE $CMAKE_SOURCE_DIR/icons/icons.qrc)
qt5_add_resources(RESOURCE_ADDED $RESOURCE)
add_executable(fluchOmat ... $RESOURCE_ADDED)

【讨论】:

弗雷泽,感谢您的提示。在 *** 上问一个问题并且在我的“代码”中出现如此愚蠢的错字非常尴尬。不幸的是,这并没有解决问题。 这些事情发生了 :-) 我想我刚刚做了同样的事情!给我一分钟,我会更新我的答案。 很抱歉一个多星期没有在这里回答。很忙。无论如何,这是一个应对问题。我以简单的方式完成了它,并将所需的所有内容添加到 src/CMakeLists.txt 在 QToolButton 上使用大于 16x16 的图标时遇到了其他问题。所以我认为我仍然有一个 CMake 问题 :) 但现在一切都按预期工作。非常感谢!

以上是关于无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt GUI 中加载和显示图像

无法在 Qt Creator 中加载 qwt_designer_plugin

Qt5 CMake 将所有库包含到可执行文件中

PyQt5 & PySide2 / 无法在“”中加载 Qt 平台插件“windows”,即使找到了

WKWebView 无法在 HTML 中加载本地资源

无法从资源加载位图