欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

统一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里面写很多函数都会不利于以后的维护,感觉查找不利。

相关标签: Qt相关开发