I'm confused about modules in Qt QML. I've read all the docs, but it doesn't make clear some basic ideas.
I understand that i can put a bunch of QML files into a directory and add a qmldir file to describe an identified module. When i do this and adjust the QML_IMPORT_PATH, QtCreator is happy and stops underlining the import ModuleName 1.0 line.
So creator is happy, but it does not work. I get module is not installed. my questions are:
Sorry, for all these questions, but the basics of these modules is just not clear. I don't understand if a "module" is just the sharing of files or is it a compiled unit.
thanks for any help.
Creating and Running QML Projects For simple UI files such as this one, select File > New File or Project > Application (Qt Quick) > Qt Quick Application - Empty from within Qt Creator. Pressing the green Run button runs the application. You should see the text Hello, World! in the center of a red rectangle.
A directory of QML files can also be imported from a remote location if the directory contains a directory listing qmldir file. Then, the directory could be imported using the URL to the remote mycomponents directory: import "http://www.my-example-server.com/myapp/mycomponents" DialogBox { CheckBox { // ... }
Qt can be used for desktop, embedded, and mobile development on multiple platforms. You can choose either a free or commercial license based on your specific needs.
I'll try to answer your questions:
QmlExtensionPlugin
for that purpose. You can also use as a module plain QML files in one directory with a qmldir
describing this module. It is a matter of distributing your code. With QmlExtensionPlugin
you provide the module compiled, if you want to hide the code.QML2_IMPORT_PATH
, in directories that you added using engine->addImportPath()
There are a bunch of things that can lead to a module not being loaded. You can check the following:
qmldir
should be the same as the directory name, where the module actually resides. For example if your module has module identifier module Test.Module
in qmldir
, your module's relative path must be Test/Module
.QML2_IMPORT_PATH
(make sure there is 2
in the name) env variable to point to directory containing your module. There is also a QQmlEngine::addImportPath
method, which adds the directory to the list to lookup for plugins.ldd
command on Linux.QT_PLUGIN_PATH
runtime variable may help to load plugins. It should point to a directory containing you plugin's directory, not the plugin's directory itself.QT_DEBUG_PLUGINS=1
and QML_IMPORT_TRACE=1
environment variablesYou can also read this link: https://doc.qt.io/qt-5/qtqml-modules-identifiedmodules.html
In my case (I have all QML files in qrc resources) worked to add qmldir to resources also and call method addImportPath("qrc:/") of QQmlApplicationEngine.
My main.cpp looks like:
QQmlApplicationEngine engine; engine.addImportPath("qrc:/"); engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
Important parts of my .pro file looks like:
RESOURCES += qml.qrc \ MyModule/mymodule.qrc QML_IMPORT_PATH += $$PWD
My qmldir:
module MyModule MyItem 2.0 MyItem20.qml MyItem 2.1 MyItem21.qml
My qrc:
<RCC> <qresource prefix="/MyModule"> <file>MyItem20.qml</file> <file>MyItem21.qml</file> <file>qmldir</file> </qresource> </RCC>
And finally my main.qml:
import QtQuick 2.5 import QtQuick.Window 2.2 import MyModule 2.0 Window { visible: true width: 640 height: 480 MyItem { anchors.fill: parent } }
QtCreator is happy (not underlining components and imports) and module is loaded. Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With