QML与C++通讯

文章展示了如何在C++中定义一个名为CTestObject的类,该类继承自QObject,使用Q_OBJECT宏以支持信号和槽。类中包含了一个枚举类型、一个信号、一个槽函数、一个可调用成员函数以及一个属性。此外,还演示了如何在QML中注册并使用这个C++对象,包括调用其方法、改变属性和响应信号。
摘要由CSDN通过智能技术生成
#ifndef CTESTOBJECT_H
#define CTESTOBJECT_H
#include <QObject>
enum Type_RET{
    RET_OK = 10,
    RET_NG
};
class CTestObject : public QObject
{
    Q_OBJECT
    Q_ENUMS(Type_RET)
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

public:
    explicit CTestObject(QObject *parent = 0);
    ~CTestObject();
//1.信号槽函数通讯
signals:
    void sendMsg(QString msg);
public slots:
    void testSlot(Type_RET ret);


//2.普通函数也可以被qml调用
public:
    Q_INVOKABLE void  invokableFunc(const QVariant& var);


//3.属性
public:
    QString name();
    void setName(const QString& name);
signals:
    void nameChanged(QString name);
private:
    QString m_name;
};

#endif // CTESTOBJECT_H
#include "ctestobject.h"
#include<QDebug>
CTestObject::CTestObject(QObject *parent) : QObject(parent)
{

}

CTestObject::~CTestObject()
{

}
//1.信号槽函数通讯
void CTestObject::testSlot(Type_RET ret)
{
    qDebug()<<"CTestObject:"<<"Hi I am CTestObject"<<ret;
    emit sendMsg("Hi I am C++ CTestObject I recieved Calling");
}
//2.普通函数也可以被qml调用
void CTestObject::invokableFunc(const QVariant& var)
{
    qDebug()<<"CTestObject:"<<"Hi I am invokableFunc";
    qDebug()<<"From QML:"+var.toString();
}
//3.属性
QString CTestObject::name()
{
    qDebug()<<"getName";
    return m_name;
}
void CTestObject::setName(const QString &name)
{
    qDebug()<<"setName";
    m_name = name;
    emit nameChanged(m_name);
}
#include <QApplication>
#include <QQmlApplicationEngine>
#include<QtQml>
#include"ctestobject.h"

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

    qmlRegisterType<CTestObject>("mylib.object",1,0,"CTestObject");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import mylib.object 1.0
//main函数中已经注册,注意写法
//qmlRegisterType<CTestObject>("mylib.object",1,0,"CTestObject");

ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
    visible: true
//本质上是个c++类,以id作为唯一区别
    CTestObject{
        id:testobject
        name:"heggg"
        onSendMsg: {
            console.log("QML:"+msg);//接受信号
        }
    }

    MainForm {
        anchors.fill: parent
        button3.onClicked: {
            //1.发送信号到槽函数
            testobject.testSlot(CTestObject.RET_OK);
            testobject.testSlot(CTestObject.RET_NG);
            //2.普通函数实现
            var qmlmsg = "hello c++!!!"
            testobject.invokableFunc(qmlmsg);
            //3.修改属性实现通讯
            console.log(testobject.name);
            testobject.name = "ssss";
        }
    }

    //3.修改属性之后收到的
    Connections{
        target: testobject;
        onNameChanged:{
            console.log("after change "+name);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值