1、QML中使用C++业务类

QML中使用C++业务类

参考此处

1、背景

在实际应用过程中,C++部分采集数据,需要在QML端展示,那就需要数据的交互。

2、方法

任何QML代码都可以访问QObject派生类实例的以下成员:
a)属性(使用Q_PROPERTY注册的属性)
b)方法(需注册为public slots或是标记为Q_INVOKABLE)
c)信号
(此外,如果已使用Q_ENUMS声明枚举,则可以使用枚举。)

3、代码

CBusiness类

#ifndef CBUSINESS_H
#define CBUSINESS_H

#include <QObject>

class CBusiness : public QObject
{
    Q_OBJECT
    //1、注册属性,
    //如在qml中给strValue赋值,会调用setStrValue函数,    
    //strValueChanged(信号)起到通知作用
    Q_PROPERTY(QString strValue READ getStrValue WRITE setStrValue
     NOTIFY strValueChanged)
    Q_PROPERTY(int intValue READ getIntValue WRITE setIntValue NOTIFY 
    intValueChanged)
public:
    explicit CBusiness(QObject *parent = 0);
    //2、Q_INVOKABLE修饰的函数,可以在qml中直接调用
    Q_INVOKABLE void sendSignal();

    void setStrValue(QString strValue);
    QString getStrValue() const;
    void setIntValue(int intValue);
    int getIntValue() const;

signals:
    //3、这些信号可以在qml直接进行connect
    void signal1();
    void signal2(QString strValue, int intValue);
    void strValueChanged(QString strValue);
    void intValueChanged(int intValue);

public slots:
    void slot1();
    void slot2(QString strValue, int intValue);

private:
    //类的属性
    QString m_strValue;
    int m_intValue;
};

#endif // CBUSINESS_H

#include "cbusiness.h"
#include <QDebug>

CBusiness::CBusiness(QObject *parent) : QObject(parent), m_strValue(""), m_intValue(0)
{
}


void CBusiness::sendSignal()
{
    qDebug() << "CBusiness::" << __FUNCTION__;
    emit signal1();
    emit signal2(m_strValue, m_intValue);
}

void CBusiness::setStrValue(QString strValue)
{
    qDebug() << "CBusiness::" << __FUNCTION__ << strValue;
    m_strValue = strValue;
    emit strValueChanged(strValue);
    qDebug()<< "CBusiness::" << "emit strValueChanged" << endl;
}

QString CBusiness::getStrValue() const
{
    qDebug() << "CBusiness::" << __FUNCTION__;
    return m_strValue;
}

void CBusiness::setIntValue(int intValue)
{
    qDebug() << "CBusiness::" << __FUNCTION__;
    m_intValue = intValue;
    emit intValueChanged(intValue);
    qDebug()<< "CBusiness::" << "emit intValueChanged";
}


int CBusiness::getIntValue() const
{
    qDebug() << "CBusiness::" << __FUNCTION__;
    return m_intValue;
}

void CBusiness::slot1()
{
    qDebug() << "CBusiness::" << __FUNCTION__;
}

void CBusiness::slot2(QString strValue, int intValue)
{
    qDebug() << "CBusiness::" << __FUNCTION__;
    qDebug() << "CBusiness:: " << strValue << "  " << intValue;
}

main.cpp

#include <QGuiApplication>
#include <QtQml>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "cbusiness.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    //qmlRegisterType注册C++类型至QML
    //arg1:import时模块名
    //arg2:主版本号
    //arg3:次版本号
    //arg4:QML类型名
    qmlRegisterType<CBusiness>("WorkClass", 1, 0, "CBusiness");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

main.qml

import QtQuick 2.4
import QtQuick.Window 2.2

import WorkClass 1.0

Window {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    signal qmlSignal1
    signal qmlSignal2(string strValue, int iValue)

    MainForm {
        anchors.fill: parent
        mouseArea.onClicked: {
            Qt.quit();
        }
    }

    MouseArea{
        anchors.fill: parent
        acceptedButtons: Qt.LeftButton | Qt.RightButton
        onClicked: {
            if(mouse.button === Qt.LeftButton){
                console.log(' Qt.LeftButton')
                //1、设置CBusiness类的属性,会调用setStrValue函数
                bussiness.strValue = "HelloCpp"
                bussiness.intValue = 2022
                //2、直接调用CBusiness类内的方法
                bussiness.sendSignal()
            }else{
                console.log(' Qt.RightButton')
                root.qmlSignal1()
                root.qmlSignal2('hesy', 2000)
            }
        }
    }

    CBusiness{
        id: bussiness
        property int addpro: 0
		//3、CBusiness类的strValueChanged信号对应的槽函数
        onStrValueChanged: {
            console.log('qml onStrValueChanged', "begin change addpro ", addpro)
            addpro++
            console.log('qml onStrValueChanged', addpro)
        }

        onIntValueChanged: {
            console.log('qml onIntValueChanged', "begin change addpro ", addpro)
            addpro++
            console.log('qml onIntValueChanged', addpro)
        }

        onAddproChanged: {
            console.log('qml onAddFun', addpro)
        }
    }

    Component.onCompleted: {
    //4、CBusiness类的信号在此处connect示例
        bussiness.onSignal1.connect(function(){console.log('no name qml function')})
        bussiness.onSignal2.connect(qmlProcess1)
        root.qmlSignal1.connect(bussiness.slot1)
        root.qmlSignal2.connect(bussiness.slot2)
        console.log('Component.onCompleted')
    }

    function qmlProcess1(str, value){
        console.log('qmlProcess1', str, value)
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值