C++类注册到QML脚本中

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:12   2343   0

也算是赶潮流吧,安装了Qt5.4.1开始做QML路线,那个界面确实很炫,不过本人对于脚本开发使用很少,在此一起学习吧,本人大叔一个,小伙伴们,如果是年轻的朋友千万不要气馁,做技术吗要踏踏实实的。

第一个看Qt QML,开篇告诉了一些简单内容,如:#include<QtQML>定义所有模块头文件,如果初学者可以,毕竟比较省事吗,我建议在学习了熟悉后,不要这么写了,用到什么定义什么,不然编译器加载太多东西会很累的。(注:qml类型只支持继承自QObject的类)

pro文件中要写QT += qml(注意大小写,尽量不要很随意)

脚本头:import QtQml 2.0

#ifndef PERSON_H
#define PERSON_H

#include <QObject>
//![0]
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;
};
//![0]

#endif // PERSON_H

这个不用解释太多,用过Qt人都应该理解,元对象技术,说白了就是把一部分代码让Qt帮你生成,看见那些宏了吗(Q_OBJECT,QPROPERTY)不清楚google,雅虎去吧。

这个典型的元对象类,有属性,有方法,怎么让加入脚本引擎解析呢,看main.cpp

#include <QQmlEngine>
#include <QQmlComponent>

这两个头文件,我们去帮助看看,The QQmlEngine class provides an environment for instantiating QML components.好了,QQmlEngine提供了一个实例化QML组件的环境,这个类就是我们提到的QML引擎,(解析脚本用滴)The QQmlComponent class encapsulates a QML component definition,QQmlComponent 就是封装了一个QML组件,可以把Person当做一个组件,呵呵。

int qmlRegisterType(const char * uri, int versionMajor, int versionMinor, const char * qmlName)

qmlRegisterType类型注册,This template function registers the C++ type in the QML system with the name qmlName, in the library imported from uri having the version number composed from versionMajor and versionMinor.这是一个模板函数,将C++类型(Qt)注册到QML系统内部,第一个参数是体现在QML的类型名,versionMajor主版本号,versionMinor子版本好,最后一个就是要注册的C++的类名

import People 1.0

这里People 是uri,1就是versionMajor,0是versionMinor

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

    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl("qrc:example.qml"));
好了,下面开始调用QML了,定义引擎和组件,

Person {
    name: "Bob Jones"
    shoeSize: 12
}
qml里面定义了Person和它的两个属性赋值。

QObject *myObject = component.create();

这样就可以把组件创建出来了,这里的代码用了一个强转,由于我们前面定义了类型所以这里这样写:

   Person *person = qobject_cast<Person *>(component.create());

那么我们就可以获取这个对象的属性信息了,测试下就可以看到打印结果了。

 qWarning() << "The person's name is" << person->name();
        qWarning() << "They wear a" << person->shoeSize() << "sized shoe";





分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP