qt — вызов c ++-слотов из плазмоида 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()
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]