qml_c++互相调用
- 注册c++的对象到qml
1.1 注册某个类到qml
注册c++的myHttpRequest对象,到qml的引擎中;
QQmlApplicationEngine engine;
QScopedPointer<myHttpRequest> myHttprequest(new myHttpRequest(runMode));
engine.rootContext()->setContextProperty("myHttprequest",myHttprequest.data());
1.2 注册某个组件到qml,当成控件来使用
(1)注册到qml
qmlRegisterType<WorkTaskPool>("MyWorkTaskPool", 1,0, "MyWorkTaskPool"); // qml里面的异步线程;
(2)SDPWorkThread.qml里面的内容
import MyWorkTaskPool 1.0
//异步线程组件
MyWorkTaskPool {
}
(3)LoginWindow.qml里面内容
function dealThreadThing(){
//异步处理
// loginThread.setObject(loginWindow)
loginThread.setObject(root) // => c++函数,调用main.qml里面的workAfterLogin函数;
loginThread.setfunName("workAfterLogin") // 显示托盘信息;
loginThread.taskStart()
}
SDPWorkThread{
id: loginThread
}
2. qml函数调用c++函数
2.1 qml中的函数:
function postFindAddr() {
var url = "https://xx/api/browser/init"
var tid = companyCode_TF.text
var contentType = "application/json"
var userAgent = "surfBrowser/2.0.0.1"
// qml调用c++函数;
myHttprequest.initAddrResource(url,userAgent,contentType,tid,1)
}
2.2 c++的函数被qml调用
class myHttpRequest:public QObject
{
……;
Q_INVOKABLE void initAddrResource(QString url, QString userAgent, QString contentType, QByteArray tid,RequestMethod method);
……;
};
3. c++调用qml里面的函数;
3.1 获取qml中的主窗口对象
QObject* root = NULL;
QList<QObject*> rootObjects = engine.rootObjects();
for(int i = 0; i<rootObjects.size();i++)
{
if(rootObjects.at(i)->objectName() == "rootObject")
{
root = rootObjects.at(i);
break;
}
}
3.2 c++调用qml里面的函数的方法:
QMetaObject::invokeMethod(m_root, "setRootVisible",Q_ARG(QVariant,false));
void SDPSysTrayIcon::onExit()
{// cpp中的函数;
m_systemTray->hide();
QMetaObject::invokeMethod(m_root, "setRootVisible",Q_ARG(QVariant,false));
QMetaObject::invokeMethod(m_root, "logOut");
QApplication::exit(0);
}
3.3 qml里面的函数
function setRootVisible(flag){
root.visible = flag
}
demo程序:https://download.csdn.net/download/onlyfunboy/20089302