• Qt5官方demo解析集21——Extending QML


    本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873


    又是一个新的系列了,只是这个系列和我们之前的Chapter系列是及其相似的。可是只是呢,Chapter主要演示了怎样使用C++创建具有可视性的类型以扩展我们的QML。而这个系列则关注于怎样使用C++扩展QML非可视化的内容。

    这里第一个小样例与Chapter的第一个小样例及其类似:


    person是我们自己定义的C++类,然后我们将其注冊为QML类型供资源文件里的example.qml使用。

    person.h,这个类与之前的piechart没有太大差别:

    #ifndef PERSON_H
    #define PERSON_H
    
    #include <QObject>
    //![0]
    class Person : public QObject             // 要注意的是由于这个对象并不须要可视化。我们继承最基础的QObject就能够了
    {                                         
        Q_OBJECT                              // 由于QML组件基于元对象系统,所以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]

    person.cpp:

    #include "person.h"
    
    // ![0]
    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;
    }

    example.qml:

    import People 1.0
    
    Person {                 // 非可视化组件。我们也不再须要以Item作为父对象
        name: "Bob Jones"
        shoeSize: 12
    }

    main.cpp:

    #include <QCoreApplication>           // 注意到Chapter中为QGuiApplication
    #include <QQmlEngine>                 // 提供QML组件的执行环境
    #include <QQmlComponent>              // 提供对QML组件的封装与訪问
    #include <QDebug>
    #include "person.h"
    
    int main(int argc, char ** argv)
    {
        QCoreApplication app(argc, argv);
    //![0]
        qmlRegisterType<Person>("People", 1,0, "Person");            // 注冊QML类型
    //![0]
    
        QQmlEngine engine;
        QQmlComponent component(&engine, QUrl("qrc:example.qml"));    // 获取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;
    }


    因为没有界面。实际执行就是一行控制台的输出:


  • 相关阅读:
    kebernet--新手填坑
    CentOS7下yum安装Kubernetes
    Centos 7 下部署Django + uWSGI + Nginx
    IPV4地址学习笔记
    【转】性能测试报告模板 V1.0
    【转载】Nginx简介及使用Nginx实现负载均衡的原理
    分布下 session 共享同步
    GC 收集算法及几种收集器优缺点讲解
    单线程集合和多线程集合
    在linux中实现多网卡的绑定 介绍常见的7种Bond模式
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5255314.html
Copyright © 2020-2023  润新知