我的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();
}
}
}
答案 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
文件就无所谓。