Qt Quick中QML和C++混合编程详解1——将C++类或对象导出到QML中(在qml中即可访问该类的实例的属性或者方法)

一、将类或对象导出到QML中-----可供QML访问的类(在qml中即可访问该类的实例的属性或者方法)

1、信号与槽
把C++对象的信号连接到QML定义的方法上,也可以把QML对象的信号连接到C++对象的槽上,也可以直接调用C++对象的信号或者槽

class ColorMaker : public QObject  
{  
    Q_OBJECT  
  
public:  
    ColorMaker(QObject *parent = 0);  
    ~ColorMaker();  
      
signals:  
    void colorChanged(const QColor & color);  
    void currentTime(const QString &strTime);  
  
public slots:  
    void start();  
    void stop();  
      
}; 

我们定义了 start() / stop() 两个槽, colorChanged() / currentTime() 两个信号,都可以在 QML 中使用

2、Q_INVOKABLE宏
在定义一个类的成员函数时使用 Q_INVOKABLE 宏来修饰,就可以让该方法被元对象系统调用。这个宏必须放在返回类型前面。

一旦你使用 Q_INVOKABLE 将某个方法注册到元对象系统中,在 QML 中就可以用 O b j e c t . {Object}. Object.{method} 来访问,colorMaker 的 main.qml 中有使用 algorithm() 和 setAlgorithm() 的 QML 代码

class ColorMaker : public QObject  
{  
    Q_OBJECT  
  
public:  
    ColorMaker(QObject *parent = 0);  
    ~ColorMaker();  
      
    Q_INVOKABLE GenerateAlgorithm algorithm() const;  
    Q_INVOKABLE void setAlgorithm(GenerateAlgorithm algorithm);  
  
signals:  
    void colorChanged(const QColor & color);  
    void currentTime(const QString &strTime);  
  
public slots:  
    void start();  
    void stop();  
};
Component.onCompleted: {  
    colorMaker.color = Qt.rgba(0,180,120, 255);  
    colorMaker.setAlgorithm(ColorMaker.LinearIncrease);  
    changeAlgorithm(colorAlgorithm, colorMaker.algorithm());  
} 

3、Q_PROPERTY
Q_PROPERTY 宏用来定义可通过元对象系统访问的属性,通过它定义的属性,可以在 QML 中访问、修改,也可以在属性变化时发射特定的信号。要想使用 Q_PROPERTY 宏,你的类必须是 QObject 的后裔,必须在类首使用 Q_OBJECT 宏。

class QQuickText : public QQuickImplicitSizeItem  
{  
    Q_OBJECT  
    Q_ENUMS(HAlignment)  
  
  
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)  
    Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)  
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)  
    ...  
      
public:  
    enum HAlignment { AlignLeft = Qt::AlignLeft,  
                       AlignRight = Qt::AlignRight,  
                       AlignHCenter = Qt::AlignHCenter,  
                       AlignJustify = Qt::AlignJustify };  
    ...  
    QString text() const;  
    void setText(const QString &);  
  
    QFont font() const;  
    void setFont(const QFont &font);  
  
    QColor color() const;  
    void setColor(const QColor &c);  
    ...  
};  
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])  

我们在实际使用中,很少能够用全 Q_PROPERTY 的所有选项,就往 QML 导出类这种场景来说,比较常用的是 READ / WRITE / NOTIFY 三个选项。我们来看看都是什么含义。
【1】READ 标记,如果你没有为属性指定 MEMBER 标记,则 READ 标记必不可少;声明一个读取属性的函数,该函数一般没有参数,返回定义的属性。
【2】WRITE 标记,可选配置。声明一个设定属性的函数。它指定的函数,只能有一个与属性类型匹配的参数,必须返回 void 。
【3】NOTIFY 标记,可选配置。给属性关联一个信号(该信号必须是已经在类中声

4、Q_ENUMS
如果你要导出的类定义了想在 QML 中使用枚举类型,可以使用 Q_ENUMS 宏将该枚举注册到元对象系统中。

一旦你使用 Q_ENUMS 宏注册了你的枚举类型,在 QML 中就可以用 C L A S S N A M E . {CLASS_NAME}. CLASSNAME.{ENUM_VALUE} 的形式来访问,比如 ColorMaker.LinearIncrease ,上节展示的 QML 代码片段已经使用了导出的枚举类型。

class ColorMaker : public QObject  
{  
    Q_OBJECT  
    Q_ENUMS(GenerateAlgorithm)  
  
public:  
    ColorMaker(QObject *parent = 0);  
    ~ColorMaker();  
      
    enum GenerateAlgorithm{  
        RandomRGB,  
        RandomRed,  
        RandomGreen,  
        RandomBlue,  
        LinearIncrease  
    };  
      
    Q_INVOKABLE GenerateAlgorithm algorithm() const;  
    Q_INVOKABLE void setAlgorithm(GenerateAlgorithm algorithm);  
  
signals:  
    void colorChanged(const QColor & color);  
    void currentTime(const QString &strTime);  
  
public slots:  
    void start();  
    void stop();  
};  
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值