欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > CMake的QML项目中使用资源文件

CMake的QML项目中使用资源文件

2025/2/5 2:09:33 来源:https://blog.csdn.net/A_zyx0808/article/details/145432040  浏览:    关键词:CMake的QML项目中使用资源文件

Qt6.5的QML项目中,我发现QML引用资源文件并不像QtWidgets项目那样直接。

在QtWidgets的项目中,我们一般是创建.qrc​资源文件,然后创建前缀/new/prefix​,再往该前缀中添加一个图片文件,比如:test.png​。

最终,我们就可以使用qrc:/new/prefix/test.png​这样的方式来引用这个图片文件。

但在QML中,情况发生了改变。

当我们创建一个.qrc​文件时,该文件会在CMakeLists.txt​被引用:

...
qt_add_qml_module(appuntitledURI untitledVERSION 1.0QML_FILES Main.qmlRESOURCES res.qrc
)
...

而QtWidgets项目中,res.qrc​将会被添加到:

qt_add_executable(appuntitledmain.cpp${PROJECT_SOURCES}res.qrc
)

添加到qt_add_qml_module()​的res.qrc​能够被QtWidgets的代码引用,不能够被QML引用。反过来也是同样的道理。经过我们实验,QtWidgets和QML应该分别工作在两个不同的资源下,二者是无法通过修改CMakeLists.txt来达成资源文件互通的效果。


假设我们在QML项目中创建了一个res.qrc​并往其中添加了以下内容:

<RCC><qresource prefix="/"><file>images/background.jpg</file></qresource>
</RCC>

在QML代码中使用"qrc:/images/background.jpg"​,你会发现QML无法打开这个图片。

为什么呢?因为二者不在同一个资源文件中:

​appVideoPlatform_raw_qml_0.qrc​是QML的运行环境,而res.qrc​并不在其中。即使我们将res.qrc​的前缀改成/qt/qml/VideoPlatform​也不能改变二者不在同一资源文件的事实。

有的时候,QML项目中的:

engine.loadFromModule("项目名", "Main");

会报错,它说你的"项目名"模块它找不到,这时你可将该语句替换成:

engine.load(QUrl(u"qrc:/qt/qml/项目名/Main.qml"_qs);

直接定位最终的Main.qml。但请注意,不同的Qt版本,资源文件的前缀可能是不一样的,因此这需要根据版本进行相应的修改(直接看它怎样生成的)。

既然添加res.qrc​无法引用图片文件,那该怎样才能够引用图片文件呢?

直接将图片添加到qml中,例如:

qt_add_qml_module(appVideoPlatformURI VideoPlatformVERSION 1.0QML_FILES Main.qmlRESOURCES images/login_background.jpg
)

然后,使用/qt/qml/你的项目名/images/login_background.jpg​来引用,这会导致引用图片的代码和Qt版本强相关(因为不同的Qt版本QML所在的资源文件前缀不同)。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com