QML < 5 > QML 访问C++ 类 (函数Q_INVOKABLE、枚举Q_ENUMS 、成员变量Q_PROPERTY、自定义结构体QVariantMap、List数据QVariantL

QML < 5 > QML 访问C++ 类 (函数Q_INVOKABLE、枚举Q_ENUMS 、成员变量Q_PROPERTY、自定义结构体(QVariantMap )、List数据QVariantList 、信号signal 、槽slot)

前言

本文记录下 QML 访问C++ 类的方式

一、C++ 类 说明

QML 访问C++类 通过元对象系统实现,故C++类需要支持元对象特性,

  • 从QObject 类派生
  • 从QQuickItem类派生

二、C++ 类 注册

将C++类 注册到QML 有两种方式:

  • 注册类
    qmlRegisterType注册类格式如下:
    qmlRegisterType<类名>(“QML 文件中import 名字”,主版本号,此版本号,“类名”)
main.cpp 中:
 qmlRegisterType<CPlusPlusObject>("CPlusPlusObject",1, 0, "CPlusPlusObject");
 QML文件:
 import CPlusPlusObject 1.0
  • 注册类实例
    QQuickView 加载QML
    CPlusPlusObject customobject;
QQuickView view;
view.rootContext()->setContextProperty("customobject", &customobject); 

QQmlEngine加载QML

QQmlEngine engine;
engine..rootContext()->setContextProperty("customobject", &customobject);

三、C++ 类 常用变量访问

本文以从QObject 类派生CPlusPlusObject 对QML 访问常用的C++ 类中变量、结构等进行说明

1.CPlusPlusObject 类声明

class CPlusPlusObject : public QObject
{
    Q_OBJECT
    ...
}

2.函数(Q_INVOKABLE)

C++ 类中定义的函数在QML 中能够访问的前提 是函数用Q_INVOKABLE 标记

  • 定义(C++)
	//.h
    Q_INVOKABLE void  customFun();
    //.cpp
    void CPlusPlusObject::customFun()
	{
    qDebug() << "customFun" ;
	}
  • 访问(QML)
    在这里插入图片描述

3.枚举(enum)

  • 定义(C++)
//.h
class CPlusPlusObject : public QObject
{
    Q_OBJECT
    Q_ENUMS(EM_CUSTOM_TYPE)
    ...
 //枚举
    enum EM_CUSTOM_TYPE
    {
        EM_CUSTOM_ONE =0,
        EM_CUSTOM_TWO,
        EM_CUSTOM_THREE,
        EM_CUSTOM_NO
    };
   Q_INVOKABLE void  customFun(EM_CUSTOM_TYPE type );
    ...
 }
 //.cpp
 void CPlusPlusObject::customFun(EM_CUSTOM_TYPE type)
{
    QString  type_str;
    switch (type)
    {
    case EM_CUSTOM_ONE:{type_str ="EM_CUSTOM_ONE" ;}break;
    case EM_CUSTOM_TWO:{type_str ="EM_CUSTOM_TWO" ;}break;
    case EM_CUSTOM_THREE:{type_str ="EM_CUSTOM_THREE" ;}break;
    case EM_CUSTOM_NO:{type_str ="EM_CUSTOM_NO" ;}break;
    default:{type_str ="Error" ;}
    }
    qDebug() << "customFun" << type_str;
}
  • 访问(QML )
    在这里插入图片描述

4.成员变量(Q_PROPERTY)

变量以Q_PROPERTY 标记,Q_PROPERTY 格式如下:
在这里插入图片描述
以基本类型作为成员变量为例,在QML中对变量取值时调用 READ 后函数getiValue ,修改变量值调用WRITE后函数 setIvalue 并触发信号signal_iValueChange :

.h
 Q_PROPERTY(int m_iValue READ getiValue WRITE setIvalue NOTIFY signal_iValueChange);
 signals:
    void  signal_iValueChange(int ivalue);
private:
    int m_iValue=0;
 .cpp
  connect(this,&CPlusPlusObject::signal_iValueChange,this,&CPlusPlusObject::slot_iValueChange);
  void CPlusPlusObject::slot_iValueChange(int iValue)
{
    qDebug() << "slot_iValueChange" << iValue;
}
int CPlusPlusObject::getiValue()
{
    qDebug() << "getiValue" ;
    return m_iValue;

}

void CPlusPlusObject::setIvalue(int iValue)
{
    m_iValue = iValue;
    qDebug() << "setIvalue" << iValue;
}
  • 调用(QML)
    在这里插入图片描述

5 .自定义结构体(struct)

自定义数据结构通常用于业务数据封装,可以将struct 转成JSON字符串传递,本文给出 QVariantMap 的方式。

//.h
//自定义结构
    struct Custom_Struct
    {
        int ivalue = 0 ;
        QString strValue;
    };
     Q_INVOKABLE QVariantMap getCPlusPlusStruct();
    private:
    Custom_Struct m_structData;
 //.cpp
 CPlusPlusObject::CPlusPlusObject(QObject *parent) : QObject(parent)
{
     m_structData.ivalue = 666;
    m_structData.strValue="sdfhkdsfn";
}
 QVariantMap CPlusPlusObject::getCPlusPlusStruct()
{
    QVariantMap map;
    map.clear();

    map.insert("ivalue",m_structData.ivalue);
    map.insert("strValue",m_structData.strValue);

    return map;
}   
  • 访问(QML)
    在这里插入图片描述

5 .List数据

可以将List 转成JSON字符串传递,本文给出 QVariantList的方式

  • 定义(C++)
//.h
 Q_INVOKABLE QVariantList getCPlusPlusVector();
  private:
    QVector<int> m_vIntValue;
//.cpp
CPlusPlusObject::CPlusPlusObject(QObject *parent) : QObject(parent)
{
    m_vIntValue.push_back(9);
    m_vIntValue.push_back(8);
    m_vIntValue.push_back(7);
}
QVariantList CPlusPlusObject::getCPlusPlusVector()
{
    QVariantList list;
    list.clear();
    foreach(int var,m_vIntValue)
    {
        list.append(QVariant::fromValue(var));
    }

    return list;
}
  • 访问(QML)
    在这里插入图片描述

6 .信号 槽 函数

对于信号 和槽 直接调用即可。

  • 定义(c++)
//.h
signals:
    void  signal_iValueChange(int ivalue);//含参
    void  signal_noPara();//不含参
 public slots:
    void  slot_noPara();
    void  slot_iValueChange(int ivalue);
 //.cpp  connect(this,&CPlusPlusObject::signal_customPara,this,&CPlusPlusObject::slot_customPara);
    connect(this,&CPlusPlusObject::signal_iValueChange,this,&CPlusPlusObject::slot_iValueChange);
void CPlusPlusObject::slot_noPara()
{
    qDebug() << " slot_noPara ";
}
void CPlusPlusObject::slot_iValueChange(int iValue)
{
    qDebug() << "slot_iValueChange" << iValue;
}
  • 访问(QML)
    在这里插入图片描述

总结

C++ 向QML 传递数据结构,可参见 Qt 文档Data Type Conversion Between QML and C++

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值