Almost all applets need to interact with external data sources and actions.
This could be showing the current battery state, editing a file or in the case of our example monitoring and fetching an RSS feed.
Within Plasmoids we have a few different ways of getting data. Each have some advantages and disadvantages.
I'm going to loosely touch on them all, hopefully providing links to find out more information on a topic.
In-built javascript
QML is all powered by a javascript engine and as we've seen in the web world a lot is powerful with just javascript.
We have access to a full XMLHttpRequest object, which behaves exactly the same as making AJAX calls in any other web page.
Component.onCompleted: {
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == XMLHttpRequest.DONE) {
var reply = request.responseXML.documentElement
//do the sort of thing that web developers normally do
}
}
request.open("GET", "http://example.com/something");
request.send();
}
It's simple-ish, particularly if you are coming from a web developer world.
QML Plugins from C++
Sometimes we need to make our own modules if we want to access existing libraries, or do fast processing or interact with hardware.
QML integrates natively with C++ amazingly, every QObject in C++ appears as a javascript object. We can create new instances, all properties, signals and invokable methods or slots are visible to the JS engine as properties and methods.
as an example if I have a QObject with the structure
class MyObject: public QObject
{
Q_PROPERTY(QString someProperty READ someProperty CONSTANT);
Q_OBJECT
public:
QString someProperty() const;
};
qmlRegisterType("MyLibrary", 1, 0 "MyObject");
from QML I can access it as follows.
MyObject {
id: source
}
Text {
text: source.someProperty
}
More information on writing plugins can be seen here
As you can see C++ plugins give you maximum integration, anything is possible, including creating new graphical types, models, or enums or anything else you might need to use in QML.
Unfortunately distribution is harder as it needs parts to be compiled.
Note that Qt provide several QML modules a full list of imports can be found here.
Including an XMLListModel that converts an XML feed into a model that can be used QtQuick, which is ideal for our tutorial of making a simple RSS reader.
Dataengines
Dataengines were an abstraction layer for fetching and data and performing actions used in Plasma 4. They provide a lanaguage agnostic method of providing data to a Plasmoid.
Dataengines made sense when we needed to be agnostic between various lanaguages; now QML is here to stay for a long long time this requirement vanishes. Writing a QML Plugin has numerous advantages over dataengines as you remove away a very limiting abstraction layer. QML Plugins allow exporting new types and enums and overall requires a lot less boiler plate code than dataengines.
However, if a dataengine already exists it totally makes sense to re-use it rather than rewriting the code from scratch, they have been honed over years of fixes and many are quite good.
For our RSS case, their is an RSS dataengine backed by libsyndication which is way more powerful than everything here as it handles every type of feed.
Unfortuantely at the time of writing this is blocked on PIM releasing.
plasmaengineexplorer provides a way to browse dataengines and contents.