从 plasmoid qml 调用 c++ 槽
Invoking c++ slots from plasmoid qml
你们的新问题。
我有一个简单的 kde (kf5) plasmoid,带有一个标签和两个按钮。
我在幕后有一个 C++ class,我目前能够将信号从 C++ 发送到 qml。
问题:我需要将信号从 qml 按钮发送到 C++ class。
通常这可以通过使用标准 Qt/qml objects 来完成,比如 QQuickView 等等,但在我的情况下我没有 main.cpp.
这是我的 C++ class header。使用 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++ 方法,会有同样的效果)。
有什么提示吗?
由于您可以通过 plasmoid.nativeInterface
访问 currentText
属性,因此该对象几乎可以肯定是您的 C++ applet class 的一个实例,即 MyPlasmoid
实例.
所以如果你的 MyPlasmoid
有一个插槽,它可以作为 plasmoid.nativeInterface
对象上的函数调用
在 C++ 中
class MyPlasmoid : public Plasma::Applet
{
Q_OBJECT
public slots:
void doSomething();
};
在 QML 中
onClicked: plasmoid.nativeInterface.doSomething()
你们的新问题。
我有一个简单的 kde (kf5) plasmoid,带有一个标签和两个按钮。
我在幕后有一个 C++ class,我目前能够将信号从 C++ 发送到 qml。
问题:我需要将信号从 qml 按钮发送到 C++ class。
通常这可以通过使用标准 Qt/qml objects 来完成,比如 QQuickView 等等,但在我的情况下我没有 main.cpp.
这是我的 C++ class header。使用 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++ 方法,会有同样的效果)。
有什么提示吗?
由于您可以通过 plasmoid.nativeInterface
访问 currentText
属性,因此该对象几乎可以肯定是您的 C++ applet class 的一个实例,即 MyPlasmoid
实例.
所以如果你的 MyPlasmoid
有一个插槽,它可以作为 plasmoid.nativeInterface
对象上的函数调用
在 C++ 中
class MyPlasmoid : public Plasma::Applet
{
Q_OBJECT
public slots:
void doSomething();
};
在 QML 中
onClicked: plasmoid.nativeInterface.doSomething()