Qml中调用C++

2 篇文章 0 订阅


在qml中调用C++类步骤如下:

方法一

1. 写一个C++类

写一个类,继承自QObject。将类中需要qml调用的方法,用前置的Q_INVOKABLE声明。属性用 Q_PROPERTY注册。
代码如下:

//testsum.h
#ifndef TESTS,LMLLM,L. UM_H
#define TESTSUM_H

#include <QObject>
//继承Q_OBJECT
class TestSum : public QObject
{
    //此处要有
    Q_OBJECT
    //需要定义GetSum() SetSum()    信号SumChanged
    Q_PROPERTY(int  sum READ GetSum WRITE SetSum NOTIFY SumChanged)
public:
    explicit TestSum(QObject *parent = nullptr);

    int GetSum() const;
    void SetSum(const int & sum);
    //Q_INVOKABLE 让其在qml可以调用
    Q_INVOKABLE void SumAdd() ;

signals:
    //在sum发生改变时发送该信号
    void SumChanged(int value);
public slots:
    //此槽函数由qml处调用触发
    void sumReduce();
private:
    int m_sum;
};

#endif // TESTSUM_H



//testsum.cpp
#include "testsum.h"
#include<QDebug>
TestSum::TestSum(QObject *parent) : QObject(parent)
{
    qDebug()<<Q_FUNC_INFO<<endl;
    m_sum = 5;
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}

int TestSum::GetSum() const
{
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
    return m_sum;
}

void TestSum::SetSum(const int &sum)
{
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
    m_sum = sum;
    qDebug()<<Q_FUNC_INFO<<"send signale"<<m_sum<<endl;
    emit SumChanged(m_sum);
    qDebug()<<Q_FUNC_INFO<<"send signale============"<<m_sum<<endl;
}

void TestSum::SumAdd()
{
    qDebug()<<Q_FUNC_INFO<<endl;
    m_sum++;
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}

void TestSum::sumReduce()
{
    qDebug()<<Q_FUNC_INFO<<endl;
    m_sum--;
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}

2. 在需要使用的地方注册该类

//main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include"testsum.h"
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    //注册类 包名+版本号 ,以及使用的对象TestSum
    qmlRegisterType<TestSum>("com.test.testSum", 1, 0, "TestSum");
    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

3. qml 中调用

import QtQuick 2.12
import QtQuick.Window 2.12
import com.test.testSum 1.0   // 注意此处 与步骤二中的一致(包名+版本号)
import QtQuick.Controls 1.4
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle {
        anchors.fill: parent
        width: 360;
        height: 360;
        id:r1;
        //此处将TestSum像正常qml控件一样调用。
        TestSum {
            id: ts;
            sum: 10;  //此处会调用SetSum函数
        }

        Button{
            id:b1;
            text:"Add";
            anchors.left:r1.left
            onClicked: {
                ts.sum += 1; //先调用GetSum  在调用SetSum,发送信号
            }
        }
        Button{
            id:b2;
            text:"Add";
            anchors.left:b1.left
            onClicked: {
                ts.sumReduce();
            }
        }

    }
    Connections {
        target: ts;
        onSumChanged:{
            //单击按钮,发送信号的接受端此处,由于ts.sum ,先调用GetSum.
            console.log("qml onSumChanged",ts.sum)
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值