我刚刚开始了一个使用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文件错了吗?
非常感谢您的帮助!
问题在于CMake的作用域规则。每个CCD_ 1调用都创建自己的作用域。在这样的子目录中声明的变量不会自动填充到父作用域。
所以问题是,虽然RESOURCE_ADDED
在icons/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})