Вызов слотов с ++ из плазмоида qml

Новый вопрос для вас, ребята.

У меня есть простой плазмоид kde (kf5) с меткой и двумя кнопками.

У меня есть закулисный класс C++, и в настоящее время я могу отправлять сигналы из C++ в qml.

Проблема: мне нужно отправить сигналы от кнопок qml в класс C++.

Обычно это можно сделать с помощью стандартных объектов Qt/qml, таких как QQuickView и т. Д., Но в моем случае у меня нет main.cpp.

Это мой заголовок класса C++. Используя QTimer, я посылаю сигнал textChanged_sig, который сообщает qml обновить значение метки:

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;
}

Это плазмоид 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 
            }   
        }             
    }
}

Элемент PlasmaComponents.Label содержит правильное значение поля C++ m_currentText.

*** ЗДЕСЬ мне нужно испустить некоторый сигнал (или вызвать метод C++, будет иметь тот же эффект).

Любой намек?

1 ответ

Решение

Так как вы можете получить доступ к currentText собственность через plasmoid.nativeInterface этот объект почти наверняка является экземпляром класса вашего апплета C++, т.е. MyPlasmoid пример.

Так что если ваш MyPlasmoid имеет слот, он может быть вызван как функция на plasmoid.nativeInterface объект

в C++

class MyPlasmoid : public Plasma::Applet
{
    Q_OBJECT

public slots:
    void doSomething();
};

в QML

onClicked: plasmoid.nativeInterface.doSomething()
Другие вопросы по тегам