统一QML与C++互调方式
程序员文章站
2024-02-12 12:19:28
...
QML开发过程中除了UI开发剩下的就是QML与C++互调方式了
最近开始学习Qt的QML开发,主要原因是原有的qwidget开发效率感觉实在不高,所以学一下QML好应用到以后的项目中,提高客户端开发效率。
为每个功能都去写函数啥的,我觉得挺麻烦的。所以我认为统一调用入口,以后开发过程更加简单,也更好维护。
QML调用C++统一用
callCppFunc(qstring funcName,QMap<qstring,qvariant> parDdata)
C++调用QML里面的函数用—信号方式
emit sig_callQml(qstring funcName,QMap<qstring,qvariant> parDdata)
下面是使用方式
首先是头文件myclass.h文件
#include <QObject>
#include <QVariantMap>
class Myclass : public QObject
{
Q_OBJECT
public:
explicit Myclass(QObject *parent = nullptr);
signals:
void sig_callQml(QString funcStr,QVariantMap data);
public:
Q_INVOKABLE QString callCppFunc(QString funcStr,QVariantMap data);
private:
QString m_str="";
};
myclass.cpp
#include "myclass.h"
#include<QDebug>
Myclass::Myclass(QObject *parent) : QObject(parent)
{
}
void Myclass::slot_tst(QString _str)
{
m_str = _str;
qDebug()<<"slot_tst";
}
QString Myclass::callCppFunc(QString funcStr,QVariantMap data)
{
qDebug()<<"getStr";
qDebug()<<funcStr;
if( funcStr == "func1" ){
//do something
}
else if( funcStr == "func2" ){
//do something
}
else if( funcStr == "func3" ){
//do something
}
else if( funcStr == "func4" ){
//do something
}
QMapIterator<QString,QVariant> iter(data);
while (iter.hasNext()) {
iter.next();
qDebug() <<"key:" << iter.key()<<"-value:" <<iter.value().toString();
}
funcStr +="123123";
emit sig_callQml(funcStr,data);
return "1111";
}
main.cpp加入上下文注册对象
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/qml/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
Myclass mclas(nullptr);
engine.rootContext()->setContextProperty("mclas",&mclas);
main.qml文件
Window {
width: 800
height: 600
visible: true
MouseArea{
anchors.fill: parent
onClicked: testClick()
}
function testClick(){
console.log("testClick")
var data = {};
data["123"] = 123123;
data["account"] = "this the account13213";
var retStr = mclas.callCppFunc("tstFunc",data);
console.log(retStr+"retStr");
}
Connections{
target: mclas
onSig_callQml:callQml(funcStr,data)
}
function callQml(funcStr,data){
console.log(funcStr);
switch(funcStr){
case "tstFunc123123":
console.log(JSON.stringify(data))
break
default:
console.log("non function");
break
}
}
}
如此就完成了所有 QML --C++的数据互相调用了。
不同的函数功能用funcStr字符串区别,QMap<qstring,qvariant> data 可以传输任意参数
剩下的就只用在这个小框架里面添加不同的函数功能了。
目前个人理解这样开发流程简单,统一所有相互调用的入口,以后维护也会简便,如果为每个功能都去添加函数,或是c++调用qml的时候在qml里面写很多函数都会不利于以后的维护,感觉查找不利。