QML资源图片无法显示且无报错问题求助
QML中Qt资源图片无法显示但无报错的问题
我可以通过Qt资源系统加载图片(CPP中能正常设置为窗口图标),但在QML的Image组件中无法显示图片,且没有任何警告或错误信息。根据文档,显示图片的代码逻辑很简单:
Image { source: "pics/qtlogo.png" }
以下是可复现的最小示例:
main.cpp
// main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QIcon> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); app.setWindowIcon(QIcon(":/images/test.png")); engine.loadFromModule("qqt", "Main"); return app.exec(); }
Main.qml
// Main.qml import QtQuick import QtQuick.Window import QtQuick.Controls import QtQuick.Layouts Window { width: 800 height: 480 visible: true title: qsTr("QtQuick testing") GridLayout { anchors.fill: parent columns: 3 RowLayout { spacing: 0 Layout.column: 0 Switch { } Image { source: ":/images/test.png" width: 48 height: 48 } } } }
CMake配置
cmake_minimum_required(VERSION 3.16) project(qqt VERSION 0.1 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 6.5 REQUIRED COMPONENTS Quick) qt_standard_project_setup(REQUIRES 6.5) qt_add_executable(appqqt main.cpp ) qt_add_qml_module(appqqt URI qqt VERSION 1.0 QML_FILES Main.qml RESOURCES resources.qrc ) # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. # If you are developing for iOS or macOS you should consider setting an # explicit, fixed bundle identifier manually though. set_target_properties(appqqt PROPERTIES # MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appqqt MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) target_link_libraries(appqqt PRIVATE Qt6::Quick ) include(GNUInstallDirs) install(TARGETS appqqt BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
资源文件resources.qrc
<RCC> <qresource prefix="/images"> <file>test.png</file> <file>test2.png</file> </qresource> </RCC>
应用运行后,开关按钮正常显示,但图片区域为空。测试过带透明和不带透明的图片,结果一致。CPP中能将同一张图片设为窗口图标,说明资源加载没问题;QML中使用在线图片链接可以正常显示,推测是QML引擎无法正确读取资源数据。
环境信息:
- Qt版本:6.5.2
- GCC版本:12.3.1 20230508(Red Hat 12.3.1-1)
解决方案
问题核心是Qt 6的QML模块资源访问规则:使用qt_add_qml_module添加的资源,默认会被封装到QML模块的私有命名空间中,传统的:/路径无法直接访问。
修复方法1:修改QML图片路径
使用QML模块的URI作为前缀,格式为"模块URI:/资源路径",示例中修改为:
Image { source: "qqt:/images/test.png" width: 48 height: 48 }
修复方法2:将资源设为全局可访问
在CMake的qt_add_qml_module配置中添加RESOURCE_PREFIX "/",让资源回到全局命名空间,这样传统的:/路径就能正常使用:
qt_add_qml_module(appqqt URI qqt VERSION 1.0 QML_FILES Main.qml RESOURCES resources.qrc RESOURCE_PREFIX "/" )
为什么CPP中能正常访问?
CPP代码使用的是Qt传统资源系统,不受QML模块资源封装规则的限制,因此:/images/test.png可以正常加载;而QML引擎处理模块内资源时,默认会用模块URI作为路径前缀,导致传统路径失效。
内容的提问来源于stack exchange,提问作者greykhakis
相关产品推荐
相关产品推荐

