• 一文读懂Qt C++与QML混合编程


    1·QML使用C++步骤

    1·1从QObject派生

       为了向QML提供一些C ++数据或功能,必须从QObject派生的类中使它可用。 将C ++类型的属性公开给QML后,由于QML引擎已与元对象系统集成,因此可以从QML访问任何QObject派生类的属性,方法和信号。

    • 从 QObject 或 QObject 的派生类继承
    • 使用 Q_OBJECT 宏

    1.2注册方法

    1.2.1注册概述

      可以通过多种方式将C++功能类公开给QML。
    QML引擎允许实例化和非实例化类型的注册。
    注册可实例化的类型可使C ++类用作QML对象类型的定义,从而允许将其用于QML代码的对象声明中以创建此类型的对象。注册还为引擎提供了其他类型的元数据,使该类型(以及该类声明的任何枚举)可用作属性值,方法参数和返回值以及在QML和C ++之间交换的信号参数的数据类型。

    1.2.2注册的类型

    • C++类可以注册为可实例化的QML类型,因此可以像QML代码中的任何普通QML对象类型一样进行实例化和使用。
    • C++类可以注册为单例类型,以便可以从QML代码导入该类的单个实例,从而允许从QML访问该实例的属性,方法和信号。
    • C++类的实例可以作为上下文属性或上下文对象嵌入到QML代码中,从而允许从QML访问该实例的属性,方法和信号。

    1.2.3各种注册类型的使用方法

    1.2.3.1注册实例化对象类型

    任何QObject派生的C ++类都可以注册为QML对象类型的定义。
    一旦在QML类型系统中注册了一个类,就可以像声明QML代码中的任何其他对象类型一样声明和实例化该类。 一旦创建了一个类实例,就可以从QML中对其进行操作。 正如将C ++类型的属性暴露给QML所解释的那样,可以从QML代码访问任何QObject派生类的属性,方法和信号。
    要将QObject派生的类注册为可实例化的QML对象类型,请调用qmlRegisterType()将该类作为QML类型注册到特定的类型名称空间中。 然后,可以导入该名称空间以使用该类型。

    1 class Message : public QObject
    2 {
    3     Q_OBJECT
    4     Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
    5     Q_PROPERTY(QDateTime creationDate READ creationDate WRITE setCreationDate NOTIFY creationDateChanged)
    6 public:
    7     // ...
    8 };

    代码解读:Message类继承QObject,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property

    Q_PROPERTY(type name
                 (READ getFunction [WRITE setFunction] |
                  MEMBER memberName [(READ getFunction | WRITE setFunction)])
                 [RESET resetFunction]
                 [NOTIFY notifySignal]
                 [REVISION int]
                 [DESIGNABLE bool]
                 [SCRIPTABLE bool]
                 [STORED bool]
                 [USER bool]
                 [CONSTANT]
                 [FINAL])
    

     一个属性行为类似于类里面的数据成员,但是他是却可以通过Meta-Object System来访问。    在外界看来,property跟类中数据成员没有什么区别,但是还是有几点不一样,参考qt文档,主要有以下几点:

    1.必须有一个read函数。它用来读取属性值。因此用Const限定。它的返回值类型必须为属性类型或者属性类型的引用或者指针。不能是其他类型例如:QWidget::hasFocus().  

    2.有一个可选的write函数。它用来设置属性值,它的返回值必须为void型,而起必须要含有一个参数。例如:QWidget::setEnabled()

    3.一个reset函数能够把property设置成其默认状态,它也是可选的。复位功能必须返回void,并且不带参数,

    4.一个NOTIFY信号是可选的 。如果定义,它提供了一个信号这个信号在值发生改变时会自动被触发。

    5.如果定义了"STODE"属性表明这是一直存在的。QWidget::minimumSize() 6.一个"DESIGNABLE"属性表明该property能在GUI builder(一般为Qt Designer)可见

    7.USER 属性 表面是否可以被用户所编辑

    8 CONST设定属性是不可修改的 所以不能跟WRITE或者NOTIFY同时出现

    9 FINAL表明该属性不会被派生类中重写

  • 相关阅读:
    投资银行的IT部门——不同之处与常见误解
    C++ error C2440: “类型转换” : 无法从“std::vector::iterator”转换为“
    查看端口占用
    Sc config http start= disabled
    DDL、DML和DCL的区别与理解
    不同网段,在路由器上如何设置网关
    服务器调优
    查看SQL Server版本信息
    基于32位Windows2003的数据库服务器优化,启用AWE,优化SQL Server
    在WIN7操作系统下,如何显示文件夹里文件的数目
  • 原文地址:https://www.cnblogs.com/GaJack/p/14153842.html
Copyright © 2020-2023  润新知