Qml 和 c++的相互交互的问题
这也是我们最关心的问题。
涉及到跟原先系统是否能集成,
这可是涉及系统架构的大问题啊。
百度/Google之后,找到了这个QM_Call_Qt_Function,原帖地址在这里:
当下载下来之后,很悲惨的发现,这个例子根本跑不起来。。。
是今天出门没看黄历?
当然不是!
例子是Qt 4.7,天才的Nokia竟然不向下兼容。怪不得要倒闭,被微软收购。哼!
修改很简单,只要把myclass.h中的 QObject对象改成 QQuickItem,然后按照c++惯例相应的也改掉,搞定。
总结:
1. Main.cpp注册自定义的类,相应把自定义的对象类登记到qml对象模型中
qmlRegisterType<MyClass>("MyClassPackage",1, 0, "MyClassType");
第1个,2个是包名字和版本号,qml 通过 Import MyClassPackage 1.0引入
第3个 qml中对象名字。例如:
Qml中
MyClassType
{
id:myclass
}
Button{
id:btn1
anchors{
horizontalCenter:parent.horizontalCenter
top:label.bottom
topMargin:10
}
text:qsTr("PROPERTY")
onClicked:label.text="myclass:"+myclass.myString;
}
C++中的声明
Q_PROPERTY(QStringmyStringREADmyStringWRITEsetmyStringNOTIFYmyStringChanged)
此时即可访问myclass的属性。
当然myclass,也会默认生成 onMyStringChanged的默认信号。
另外也可以定义自定义的消息,在qml中按需响应。
C++中
signals:
voidmyStringChanged();
voidmySignals(QStringstr);
qml中
Connections
{
target:myclass
onMyStringChanged:{
}
onMySignals:{
}
}
2. qml 调用c++,需要在该函数前面加入:Q_INVOKABLE
C++中
Q_INVOKABLEinttestDll(inta,intb);
Q_INVOKABLEinttestLoadDll(inta,intb);
Q_INVOKABLEinttestStaticLib(inta,intb);
Qml中的调用
Button{
id:btnT3
text:qsTr("myclass.testDll")
onClicked:{
label.text=myclass.testDll(123,456);
}
}
Button{
id:btnT4
text:qsTr("MyClass::testStaticLib")
onClicked:{
label.text=myclass.testStaticLib(11,123);
}
}
真是高端大气上档次!