我一直在尝试使用 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>
开关按钮显示正常,但图像不显示。图像具有透明度,但我也测试了不透明的图像,结果相同。正如您从 cpp 文件中看到的,我尝试使用与窗口图标相同的图像,效果很好。所以资源正在正确加载。我还尝试在 QML 代码中证明在线图像的 URL,这实际上有效,所以我怀疑 QML 引擎无法正确读取资源数据。
Qt版本是6.5.2。 gcc 版本 12.3.1 20230508(红帽 12.3.1-1)(GCC)。
我怀疑我遗漏了一些明显的东西。感谢任何反馈。
所以在我发布问题后,我立即找到了错误。正如我所怀疑的那样,这是显而易见的。我决定将问题保留在这里,以防其他人遇到同样的问题。
事实证明,在 QML 中,来自资源系统的文件需要在路径中添加
qrc:/
前缀。我之前使用过 Qt Widgets,所以我假设我可以使用与 :/
相同的前缀,但事实并非如此。因此解决方法是将 Image
更改为以下内容:
Image {
source: "qrc:/images/test.png"
}