首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法加载Qt5/cmake中Qt资源文件中指定的映像

无法加载Qt5/cmake中Qt资源文件中指定的映像
EN

Stack Overflow用户
提问于 2013-08-21 14:24:31
回答 1查看 9.2K关注 0票数 1

我刚刚启动了一个使用cmake作为构建系统的Qt5项目。到目前为止,这个工作非常好,但我有一个图标的问题,我想从一个qrc文件加载。

项目结构:

代码语言:javascript
复制
CMakeLists.txt
-- icons/
   CMakeLists.txt
   icons.qrc
   locked.png
-- src/
   CMakeLists.txt
   source files...

顶级CMakeLists.txt:

代码语言:javascript
复制
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 /

代码语言:javascript
复制
set(RESOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/icons.qrc
)

qt5_add_resources(RESOURCE_ADDED ${RESOURCE})

图标中的icons.qrc /

代码语言:javascript
复制
<RCC>
    <qresource prefix="/">
        <file alias="locked">locked.png</file>
    </qresource>
</RCC>

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

代码语言:javascript
复制
add_executable(fluchOmat ${SOURCES} ${HEADERS} ${fluchOmat_FORMS} ${RESOURCES_ADDED})

一些示例代码

代码语言:javascript
复制
QPixmap pm(":/locked.png");
qDebug("Width: " + pm.width());

什么也不回,所以很明显这不管用。

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

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-21 22:46:50

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

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

要提高变量的作用域,可以在图标/CMakeLists.txt中这样做:

代码语言:javascript
复制
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中这样做:

代码语言:javascript
复制
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:

代码语言:javascript
复制
set(RESOURCE ${CMAKE_SOURCE_DIR}/icons/icons.qrc)
qt5_add_resources(RESOURCE_ADDED ${RESOURCE})
add_executable(fluchOmat ... ${RESOURCE_ADDED})
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18360100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档