1

我刚刚开始使用 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.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文件错了吗?

任何帮助是极大的赞赏!

4

1 回答 1

4

问题在于 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})
于 2013-08-21T22:46:50.413 回答