[Interest] QQmlExtensionPlugin not loading
Martin Leutelt
martin.leutelt at basyskom.com
Fri Mar 9 16:41:57 CET 2018
From: Jesper Huijgens <jesper.huijgens at sioux.eu>
To: <interest at qt-project.org>
Sent: 3/9/2018 3:43 PM
Subject: Re: [Interest] QQmlExtensionPlugin not loading
Hello,
First of all. Thanks for the help so far, got me quite a bit further.
What I try to achieve is having plugins that can inject e.g. a button on a toolbar. Simply put: an application that can be extended via plugins.
During development I do not know what plugins there will be at runtime. So I do not know what to import in Main.qml.
All plugins also implement an interface I made with a method initPlugin.
In this method the plugin can create a qml object and inject it into the already running UI (Calling this method is triggered from within the main UI).
Easiest/simplified example would be:
--------------------
MyPlugin.cpp:
void MyPlugin::registerTypes (const char* uri) // uri => "MyPlugin"
{
qmlRegisterType<MyPluginType>(uri, 1, 0, "MyPluginType");
}
void MyPlugin::initPlugin (QObject* objectInsideTheRunningUI)
{
QQmlEngine* engine = QQmlEngine::contextForObject(objectInsideTheRunningUI)->engine();
auto newButton = createButtonUsingEngine(engine, "MyPluginButton.qml"); // Method creating QQmlComponent, and calling QQmlComponent.create() on it
}
MyPluginButton.qml:
import QtQuick 2.10
import MyPlugin 1.0 // Here I get module MyPlugin is not installed.
Item {
MyPluginType {}
}
--------------------
TL;DR:
If I import my plugin module in Main.qml it works like a charm.
If I dynamically create a qml object which call the same import call (import MyPlugin 1.0) it does not work. I get module MyPlugin is not installed.
In tried calling the registerTypes method inside initPlugin. This seems to work. But I am curious why it works if I call import in Main.qml and not in MyPluginButton.qml, and what I should do to make it work.
Have you tried debugging it with QML_IMPORT_TRACE? ;)
Generally I would recommend you take a different approach then "injecting" QML items into the engine (although this can be made to work, I guess).
A more flexible approach to extending an application like you plan to do is probably abstracting the actual functionality behind your button and only move that into the plugin (which by the way could be an actual Qt plugin that you can load with QPluginLoader).
Your application would at startup (or at runtime, both would be possible) then gather information about the available plugins and create a model, which you can pass to the UI to dynamically create buttons that map to functions in the plugins.
Thanks.
Kind regards,
Jesper
Regards
Martin
On 09-03-18 14:53, Jesper Huijgens wrote:
Ok, I see what the problem is.
I expected Qt to automatically register the types. Even without the import statement.
--
Jesper
On 09-03-18 14:44, Martin Leutelt wrote:
From: Jesper Huijgens <jesper.huijgens at sioux.eu>
To: <interest at qt-project.org>
Sent: 3/9/2018 2:24 PM
Subject: Re: [Interest] QQmlExtensionPlugin not loading
With QML_IMPORT_TRACE I see again the right folders. But I do not see any attempt of loading the plugin.
You're missing an import statement in your main.qml to load your plugin (see http://doc.qt.io/qt-5/qtqml-modules-cppplugins.html).
addPluginPath()/addLibraryPath() isn't necessary for QML plugins, but (depending on your project hierarchy or how your application is installed/deployed) you might need addImportPath().
Kind regards,
Jesper
Regards
Martin
On 09-03-18 14:20, Martin Leutelt wrote:
From: Jesper Huijgens <jesper.huijgens at sioux.eu>
To: <interest at qt-project.org>
Sent: 3/9/2018 2:04 PM
Subject: [Interest] QQmlExtensionPlugin not loading
Hi all,
For our project we see that QQmlExtensionPlugins are not loaded.
I made a very basic example project that creates a QQmlExtensionPlugin
and an application that should use. The plugin, with the corresponding
qmldir, are placed in a plugin subdir in the output directory of the
application.
The application sets both libraryPath and pluginPath. I output the
pluginPathList(), I see what I think are the correct folders on the
debug output.
I placed a qDebug() in registerTypes of the plugin. I see nothing on the
debug output.
Setting QT_DEBUG_PLUGINS to 1 show me a lot of libraries being loaded.
But not my plugin.
Try QML_IMPORT_TRACE instead, since QT_DEBUG_PLUGINS is for debugging plugins for Qt itself, not the QML engine.
I work on KDE Neon with g++ 5.4.0, CMake 3.10.0 and Qt 5.10.
Kind regards,
Jesper
Regards
Martin
_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20180309/e98d10ff/attachment.html>
More information about the Interest
mailing list