【问题标题】:How to invoke QML methods from C++?如何从 C++ 调用 QML 方法?
【发布时间】:2017-01-06 16:08:21
【问题描述】:

我有包含方法的 QML 文件。这些方法需要使用 QMetaObject::invokeMethod() 从 C++ 调用。

QML:

// MyItem.qml
import QtQuick 2.0

Item {
    function signalBroker(name, value) {
    if (name == "volume_radio") {           
        updateVolume(value);
    } else if (name == "mute_radio") {
        updateMute();
    }
}

}

【问题讨论】:

  • 嗯,问题的第二句回答了。
  • Qt文档没有很多例子,你有我的案例或者解释的例子吗?
  • 你的意思是喜欢这个文档页面:doc.qt.io/qt-5/…?
  • 随时调用invokeMethod()。
  • 作为一般建议,如果您真的想要这个,我会说重新考虑。这会创建一个 C++ -> QML 依赖关系,即 C++ 依赖于具有特定 API 的特定对象存在于 QML 端。集成通常以相反的方式完成,以保持动态 QML 方面的灵活性

标签: qt qml


【解决方案1】:

不知道为什么要依赖 Javascript,但这里是完整的代码。

sample.pro

QT += qml quick
QT -= gui
SOURCES += main.cpp
RESOURCES += resources.qrc

main.cpp

#include <QCoreApplication>
#include <QQmlEngine>
#include <QQmlComponent>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QQmlEngine engine;
    QQmlComponent component(&engine, "qrc:/main.qml");

    QObject *object = component.create();

    QVariant name = "volume_radio";
    QVariant value = 24;
    QMetaObject::invokeMethod(object, "signalBroker",
            Q_ARG(QVariant, name),
            Q_ARG(QVariant, value));

    delete object;

    return app.exec();
}

resources.qrc

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
    </qresource>
</RCC>

main.qml

import QtQuick 2.0

Item {
    function updateVolume(value) {
        console.log('Volume from C++ = ' + value)
    }

    function updateMute() {
        console.log('Radio is now mute.')
    }

    function signalBroker(name, value) {
        if (name === 'volume_radio') {
            updateVolume(value)
        } else if (name === 'mute_radio') {
            updateMute()
        }
    }
}

当我运行它时,我得到以下输出

qml: Volume from C++ = 24

请注意:在 main.cpp 加载 main.qml 文件时,请确保提供完整路径(或 :/main.qml)或 qrc URL,否则编译器将找不到 QML您正在尝试加载的文件。

您的应用可以是 GUI 应用或控制台应用,只要包含相应的头文件并更新您的 .pro 文件即可。

【讨论】:

  • 谢谢 Eddie,我可以在我的 qt 类的任何地方调用它吗: QObject *object = component.create() QVariant name = "volume_radio"; QVariant 值 = 24; ?
  • 是的,只要 QtCoreApplicationQtGuiApplication 被构造。为什么不只是创建一个函数或其他东西?请记住,如果您尝试获取 Javascript 函数的返回值,则需要使用 Q_RETURN_ARG 而不是 Q_ARG。例如,QMetaObject::invokeMethod(object, "javascriptFunc", Q_RETURN_ARG(QVariant, valueFromJS)); 其中valueFromJS 也是QVariant 类型。
  • @Ismaela.D 我很高兴它现在正在工作。也请接受答案。您可以在答案的左上角找到接受按钮,如果您有任何问题,请随时提出更多问题。谢谢;-)
猜你喜欢
  • 2018-05-14
  • 2018-01-06
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多