简体   繁体   中英

Invoking c++ slots from plasmoid qml

New question for you guys.

I have a simple kde (kf5) plasmoid, with a label and two buttons.

I have a C++ class behind the scenes, and I am currently able to send signals from C++ to qml.

The problem: I need to send signals from the qml buttons to the C++ class.

Usually this could be done by using the standard Qt/qml objects like QQuickView and so on, but in my case I have no main.cpp.

This is my C++ class header. Using a QTimer , I emit the textChanged_sig signal, which tells the qml to refresh the label's value:

class MyPlasmoid : public Plasma::Applet
{
    Q_OBJECT
    Q_PROPERTY(QString currentText READ currentText NOTIFY textChanged_sig)

public:
    MyPlasmoid( QObject *parent, const QVariantList &args );
    ~MyPlasmoid();

    QString currentText() const;

signals:
    void textChanged_sig();

private:
    QString m_currentText;
}

This is the plasmoid main.qml:

import QtQuick 2.1
import QtQuick.Layouts 1.1
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.components 2.0 as PlasmaComponents

Item {
    Plasmoid.fullRepresentation: ColumnLayout {
        anchors.fill: parent
        PlasmaComponents.Label {
            text: plasmoid.nativeInterface.currentText
        }

        PlasmaComponents.Button { 
            iconSource: Qt.resolvedUrl("../images/start") 
            onClicked: { 
                console.log("start!")    *** HERE 
            }   
        }             
    }
}

The PlasmaComponents.Label item contains the correct value of the c++ field m_currentText.

*** HERE I need to emit some signal (or invoke a c++ method, would have the same effect).

Any hint?

Since you can access the currentText property through plasmoid.nativeInterface that object is almost certainly an instance of your C++ applet class, ie a MyPlasmoid instance.

So if your MyPlasmoid has a slot, it can be called as a function on the plasmoid.nativeInterface object

in C++

class MyPlasmoid : public Plasma::Applet
{
    Q_OBJECT

public slots:
    void doSomething();
};

in QML

onClicked: plasmoid.nativeInterface.doSomething()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM