qml-与cpp

1 setContextProperty 注入实例

void QQmlContext::setContextProperty(const QString &name, QObject *value)

Set the value of the name property on this context.

QQmlContext does not take ownership of value.

See also contextProperty().

 cpp的类 persion.h 和persion,cpp

#ifndef PERSON_H
#define PERSON_H

#include <QObject>
#include <QString>

class Person : public QObject
{
    Q_OBJECT
public:
    explicit Person(QString name,int age);

    //Q_INVOKABLE 函数可以被qml调用
    Q_INVOKABLE  void printInfo() const noexcept;
signals:


private:
    QString _name;
    int  _age;
};

#endif // PERSON_H
#include "person.h"
#include <QDebug>


Person::Person(QString name,int age)
    :_name(qMove(name))
    ,_age(qMove(age))
{

}


void Person::printInfo() const noexcept{
    qDebug() << "name" << _name << ";age" << _age;


}

main函数的调用

qml文件中调用cpp的printinfo方法:

连接qml的信号和cpp的槽

连接qml中Button的clicked 

 

qml自定义信号 

    Button{
        objectName:"testButton"
        text: "button"

        property int clickCnt: 0
        signal clickCount(int cnt)

        onClicked: {
            TestModule.printInfo();

            clickCount(++clickCnt)
        }
    }

连接:

qml中处理c++信号

2 qmlRegisterType 注入类型

int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
        该模板函数在 QML 系统中注册名为 qmlName 的 C++ 类型,在从 url导入的库中,该库具有由 versionMajor 和 versionMinor 组成的版本号。
        返回 QML 类型 ID。
        这个模板函数有两种形式:

        前者是将类型 T 注册为新类型的标准形式。后者允许在指定版本中注册类的特定修订(请参阅类型修订和版本)。

 class Bar : public QObject
 {
     Q_OBJECT
     Q_PROPERTY(QString baz READ baz WRITE setBaz NOTIFY bazChanged)

 public:
     Bar() {}

     QString baz() const { return mBaz; }

     void setBaz(const QString &baz)
     {
         if (baz == mBaz)
             return;

         mBaz = baz;
         emit bazChanged();
     }

 signals:
     void bazChanged();

 private:
     QString mBaz;
 };

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import Bar 1.0

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Button{
        objectName:"testButton"
        text: "button"

        property int clickCnt: 0
        signal clickCount(int cnt)

        onClicked: {
            bar.baz = "cnt" + clickCnt
            clickCount(++clickCnt)
        }
    }

    Bar {
         id:bar

         baz: "abc"
         onBazChanged:{
            console.log("bar",baz)
         }
     }

}

 附加属性qmlAttachedPropertiesObject

demo:声明Bar 是Foo的附加属性

#ifndef BAR_H
#define BAR_H

#include <QObject>

#include <qqml.h>
class Bar : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString baz READ baz WRITE setBaz NOTIFY bazChanged)

public:
    Bar(QObject *object):QObject(object) {}

    QString baz() const { return mBaz; }

    void setBaz(const QString &baz)
    {
        if (baz == mBaz)
            return;

        mBaz = baz;
        emit bazChanged();
    }

signals:
    void bazChanged();

private:
    QString mBaz;
};


class Foo : public QObject
{
    Q_OBJECT

public:
    Foo() {}

    static Bar *qmlAttachedProperties(QObject *object) // 需要定义一个静态函数来返回这个静态属性的对象
    {
        //当QML声明该附加属性时调用这个函数,返回一个该附加属性类的对象
        return new Bar(object);
    }
private:

};

QML_DECLARE_TYPEINFO(Foo, QML_HAS_ATTACHED_PROPERTIES)   // 利用QML_DECLARE_TYPEINFO声明使Foo类得以支持附加属性


#endif // BAR_H

若是使用C++来扩展QML,要想实现一个附加属性的功能,需要两个步骤:

        提供一个静态函数:static [类型] * qmlAttachedProperties(QObject *);  注意,这个返回类型可以是自身,也可以是关联的类型
        使用宏声明该类型支持附加属性:QML_DECLARE_TYPEINFO([类型], QML_HAS_ATTACHED_PROPERTIES) 

 注册:

使用附加属性:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import Foo 1.0

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Button{
        objectName:"testButton"
        text: "button"

        property int clickCnt: 0
        signal clickCount(int cnt)

        onClicked: {

            Foo.baz = "cnt" + clickCnt++
            console.log("bar",Foo.baz)
        }

        Foo.onBazChanged:{
        console.log("onBazChanged",Foo.baz)
        }
    }



}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值