简介
c++可以直接调用QML中的函数,这个函数原型是
bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( Q_NULLPTR ), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument())
警告
Q_RETURN_ARG() 和 Q_ARG() 参数必须是QVariant,否则会提示找不到调用函数
代码
main.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
visible: true
width: 640
height: 480
Loader
{
sourceComponent: idTextExtend
height:200
width:200
}
Component
{
id:idTextExtend
Rectangle
{
objectName: "TextExtend"
property string strText:"Hello"
function setTextString(msg) {
strText=msg
}
Text
{
id:idInnerText
anchors.fill: parent
text:strText
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
color:"red"
}
}
}
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject* root = engine.rootObjects().first();
QObject* pctrlobj = root->findChild<QObject*>("TextExtend");
if (pctrlobj)
{
QVariant returnedValue;
QVariant msg = "message sended from C++";
QMetaObject::invokeMethod(pctrlobj, "setTextString", Q_RETURN_ARG(QVariant, returnedValue),Q_ARG(QVariant, msg));
}
return app.exec();
}
参考
【1】http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#invoking-qml-methods
源码地址
下载地址 : https://github.com/CodeBees/qtExample/tree/master/cplusplusCallQmlFucntion