You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:54:51