QML 入门之QMl与C++类相互访问(一)

    从Qt5后,引入了QML,以前一直用C++开发,现在看了看QML,以啃官方文档为主,将学习心得记录下来。

    QML 与 C++ 交互主要用到了一个注册函数 qmlRegisterType ,函数原型如下:

  template<typename T>
  int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);

  template<typename T, int metaObjectRevision>
  int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);

    uri  表示在 QML 文件中 import  时的名称,versionMajor 和 versionMinor 表示版本号, qmlName 表示要导出的类名。

    例如在 C++ 代码中注册如下:

int main(int argc, char *argv[])
{
    // ...
    qmlRegisterType<MySliderItem>("qmlcomponents", 1, 0, "Slider");
    // ...
}

    在 QML 中引用如下:

  //example.qml
  import qmlcomponents 1.0

  Slider {
      // ...
  }

    官方提供了一个示例 adding, 这里我们以官方示例作为讲解。

    示例组成如下:一个 Person 类,pro 文件,main.cpp 文件,及一个 qml 文件

    1. 首先 pro 文件里添加 qml 支持

QT = core qml

SOURCES += main.cpp \
           person.cpp
HEADERS += person.h
RESOURCES += adding.qrc

target.path = $$[QT_INSTALL_EXAMPLES]/qml/referenceexamples/adding
INSTALLS += target

    2. Person 类里使用 Q_PROPERTY 导出属性 name 和 shoeSize,以便 QML 访问

//Person.h
#ifndef PERSON_H
#define PERSON_H

#include <QObject>

class Person : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize)
public:
    Person(QObject *parent = 0);

    QString name() const;
    void setName(const QString &);

    int shoeSize() const;
    void setShoeSize(int);

private:
    QString m_name;
    int m_shoeSize;
};
#endif
// Person.cpp
#include "person.h"

Person::Person(QObject *parent)
: QObject(parent), m_shoeSize(0)
{
}

QString Person::name() const
{
    return m_name;
}

void Person::setName(const QString &n)
{
    m_name = n;
}

int Person::shoeSize() const
{
    return m_shoeSize;
}

void Person::setShoeSize(int s)
{
    m_shoeSize = s;
}

3. 在 main.cpp 中注册 Person 类

qmlRegisterType<Person>("People", 1,0, "Person");

然后在 qml 中导入 Person

// example.qml
import People 1.0

Person {
    name: "Bob Jones"
    shoeSize: 12
}

最后在 main.cpp 中访问 example.qml 中的属性值

// main.cpp
#include <QCoreApplication>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QDebug>
#include "person.h"

int main(int argc, char ** argv)
{
    QCoreApplication app(argc, argv);
    //注册Person类
    qmlRegisterType<Person>("People", 1,0, "Person");

    // 访问qml
    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl("qrc:example.qml"));
    Person *person = qobject_cast<Person *>(component.create());
    if (person) {
        qWarning() << "The person's name is" << person->name();
        qWarning() << "They wear a" << person->shoeSize() << "sized shoe";
    } else {
        qWarning() << component.errors();
    }

    return 0;
}

程序运行结果如下:

The person's name is "Bob Jones"
They wear a 12 sized shoe




   







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值