无法在 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 Creator 中加载 qwt_designer_plugin