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

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

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

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

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

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

Это мой заголовок класса С++. Используя 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.

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

Любой намек?


person Giancarlo    schedule 07.03.2017    source источник
comment
Когда вы говорите, что у вас нет main.cpp, что именно вы имеете в виду? Мне не хватает места, где вы создаете свой MyPlasmoid! Является ли ваш вопрос просто при условии, что я создал экземпляр объекта C++ с помощью QML следующим образом: import MyPlasmoid; MyPlasmoid { id: plasmo } Как мне вызвать функцию plasmo Или это ваш вопрос Как, черт возьми, мне создать экземпляр моего класса в первую очередь?   -  person at-2500    schedule 08.03.2017
comment
возможно, KDE каким-то особым образом создает экземпляр кода QML? Я не уверен, просто предположил, что...   -  person folibis    schedule 08.03.2017
comment
именно, kde frameworks устанавливает все (так что: нет main.cpp, мой класс компилируется автоматически как плагин)   -  person Giancarlo    schedule 08.03.2017


Ответы (1)


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

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

in C++

class MyPlasmoid : public Plasma::Applet
{
    Q_OBJECT

public slots:
    void doSomething();
};

в QML

onClicked: plasmoid.nativeInterface.doSomething()
person Kevin Krammer    schedule 08.03.2017
comment
ОТЛИЧНЫЙ! Спасибо - person Giancarlo; 08.03.2017