QML 图像未显示在窗口中,没有错误或警告

问题描述 投票:0回答:1

我一直在尝试使用 QtQuick 创建用户界面。这通常是一次很好的体验,但我在窗口中显示图像时遇到问题。我可以通过 Qts 资源系统加载图像,但它们没有显示在窗口中,没有任何警告或错误消息。

根据文档,获取要显示的图像应该像

一样简单
Image {
    source: "pics/qtlogo.png"
}

为了可重复性,我将提供一个完整的最小示例:CPP 文件、QML 文件、CMake 配置和资源文件。

// 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
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_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}
)
<RCC>
    <qresource prefix="/images">
        <file>test.png</file>
        <file>test2.png</file>
    </qresource>
</RCC>

Screenshot of application 开关按钮显示正常,但图像不显示。图像具有透明度,但我也测试了不透明的图像,结果相同。正如您从 cpp 文件中看到的,我尝试使用与窗口图标相同的图像,效果很好。所以资源正在正确加载。我还尝试在 QML 代码中证明在线图像的 URL,这实际上有效,所以我怀疑 QML 引擎无法正确读取资源数据。

Qt版本是6.5.2。 gcc 版本 12.3.1 20230508(红帽 12.3.1-1)(GCC)。

我怀疑我遗漏了一些明显的东西。感谢任何反馈。

c++ qt qml qimage
1个回答
0
投票

所以在我发布问题后,我立即找到了错误。正如我所怀疑的那样,这是显而易见的。我决定将问题保留在这里,以防其他人遇到同样的问题。

事实证明,在 QML 中,来自资源系统的文件需要在路径中添加

qrc:/
前缀。我之前使用过 Qt Widgets,所以我假设我可以使用与
:/
相同的前缀,但事实并非如此。因此解决方法是将
Image
更改为以下内容:

Image {
    source: "qrc:/images/test.png"
}
© www.soinside.com 2019 - 2024. All rights reserved.