QML < 5 > QML 访问C++ 类 (函数Q

QML < 5 > QML 访问C++ 类 (函数Q,第1张

QML < 5 > QML 访问C++ 类 (函数Q 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",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 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++

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5635734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存