[Interest] (Q)Plugins and QML/Quick

Rui Oliveira ruilvo at hotmail.com
Tue Sep 14 19:24:53 CEST 2021


Hey,

I think we're speaking about different things. I've explored a bit and 
it seems that it's typical to create QML modules/plugins to expose new 
QML types that are found at runtime. But you still explicitly use those 
types. Like, an external project will add the "MyAwesomeAlgorithm" type 
and you can use that in your application's QML:

```
import <plugin.uri>

MyAwesomeAlgorithm
{
    id: "myAwesomeAlgo
}

```

But my goal is to not know about the types beforehand at all. It's 
basically the "copy the dll to the application folder and it'll 
magically show up as an option" pattern. The goal is to provide an 
extensibility framework, like eclipse, or web browser addons. Not just 
using a type defined elsewhere.

This is more or less what I mean: 
https://stackoverflow.com/questions/66618613/qml-c-classes-with-bring-your-own-component

Thanks,
Rui

Às 10:02 de 14/09/2021, Ulf Hermann escreveu:
>> Maybe I missed something, but this seems more like a solution to 
>> manage QML resources and modules that you know about at compile time.
>
> The QML import path allows you to combine modules compiled separately 
> in the context of different projects.
>
>> I'm talking about a runtime problem. Lemme try to explain with some 
>> simplified code. Allow me to leave a link to some markdown and syntax 
>> highlighted stuff:
>>
>> https://gist.github.com/ruilvo/43365e67f6d3ea472531738fd5a52793
>
> Do not start with something as low level as a plugin. Think of your 
> code as logical units, defining different parts of your UI. Then 
> create a QML module for each. The plugins are automatically generated. 
> You don't have to care about them. Using "import Some.Module" in QML 
> will load them as necessary.
>
> You only need to make sure the QML engine knows about the relevant 
> import paths. If you use the default directory layout as shown in the 
> blog post, the default import path will be enough.
>
> Otherwise you have to call QQmlEngine::addImportPath(). This is likely 
> what you have to do if you want to combine modules from different 
> projects.
>
> You say that "import mytype" is not possible. However, there must be 
> some starting point in your application. You need to have code that 
> specifies a first plugin to load by file name. This can instead be 
> phrased as a module URI. If you insist on not having an entry point 
> main.qml, you can dynamically generate a two-line QML document and 
> load it via QQmlComponent::setData():
>
> // given moduleName and elementName:
> QQmlEngine engine;
> engine.addImportPath( ... );
> QQmlComponent component(&engine);
> const QString qml = QStringLiteral("import %1\n%2{}").arg(moduleName, 
> elementName)
> component.setData(qml.toUtf8(), QUrl());
> QObject *myQmlObject = component.create();
>
> best regards,
> Ulf
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest


More information about the Interest mailing list