如何从C ++调用QML方法?

时间:2017-01-06 16:08:22

标签: qt qml

我的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();
    }
}

}

1 个答案:

答案 0 :(得分: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.qml文件时,在main.cpp上请确保提供完整路径(或:/main.qml)或qrc URL或编译器将找不到您要加载的QML文件。

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