QML 与 C++ 交互之工厂方法

先看例如以下的类声明,声明了一个产品类和工厂类。

#include <QObject>

class Productor : public QObject
{
Q_OBJECT
Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)
public:
explicit Productor(QObject *parent = 0); int age() const;
void setAge(int age);
signals:
void ageChanged(); private:
int m_age;
}; class QQmlEngine;
class QJSEngine;
class Factory : public QObject
{
Q_OBJECT
public:
Factory(QObject* parent); Q_INVOKABLE Productor* create(); static QObject *singleton(QQmlEngine *engine, QJSEngine *scriptEngine);
};

c++ main 函数中注冊方式例如以下:

    qmlRegisterType<Productor>("FactoryDemo", 1, 0, "Productor");

    qmlRegisterSingletonType<Factory>("FactoryDemo", 1, 0, "Factory", &Factory::singleton);

Productor 注冊为类型,Factory 注冊为单例。在 QML 中使用例如以下:

import QtQuick.Controls 1.2
import FactoryDemo 1.0 Button {
text: qsTr("user create function")
onClicked: {
var p = Factory.create();
console.log(p.age);
}
}

语法补全和智能提示

因为 QtCreator 对 QML 函数的返回值类型支持不佳,所以无法对 p 进行代码的智能提示。

这个时候就能够使用属性与 QOjbect* 来 hack 一下了。

仅仅需改动一行代码。且看例如以下:

class Factory : public QObject
{
Q_OBJECT
Q_PROPERTY(Productor* newCreate READ create )
...
};

仅仅需加入一行属性声明的代码就可以。

qml 使用例如以下。能够进行代码补全。

            var p2 = Factory.newCreate;
console.log(p2.age);

QML 与 C++ 交互之工厂方法的更多相关文章

  1. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  2. php实现设计模式之 工厂方法模式

    <?php /* * *工厂方法模式,创建型模式 定义一个用于创建对象的工厂接口,让子类决定实例化哪一个类.Factory Method使用一个类的实例化延迟到其子类 * * 四个角色: * 工 ...

  3. [设计模式]<<设计模式之禅>>工厂方法模式

    1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...

  4. 工厂方法(Factory Pattern)

    工厂方法模式定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类.(注:“决定”不是指模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需要知道实际 ...

  5. 3.3FactoryMethod——工厂方法

    意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 其实在抽象工厂模式中,经过改进后的模式就是工厂方法模式,所以不多说了,上UML图 ...

  6. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  7. 设计模式(3)--FactoryMethod( [2] 工厂方法模式)--创建型

    1.模式定义: 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 2.模式特点: (1)工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承. (2 ...

  8. QtQuick多页面切换、多页面切换动画、多个qml文件数据交互

    一.QtQuick多页面切换方法 (1)“隐藏法” 前一个视图visible设为false或者透明度opacity设为0,相当于“隐藏”了,实际还存在: 要显示的视图visible设为true或者透明 ...

  9. 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

随机推荐

  1. ubuntu16.04服务器apache的ssl证书配置

    背景:在腾讯云申请的免费证书1年,服务器ubuntu 16.04版本,我的是多域名 1.ssl模块的安装 sudo a2enmod ssl //开启apache ssl模块 a2ensite defa ...

  2. [CodeChef-QTREE]Queries on tree again!

    题目大意: 给定一个环长为奇数的带权基环树,支持以下两种操作: 1.两点间最短路取反: 2.两点间最短路求最大子段和. 思路: 首先找出环,然后对每一个外向树轻重链剖分, 用线段树维护每一个区间的和. ...

  3. ZOJ 1940 Dungeon Master 三维BFS

    Dungeon Master Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Desc ...

  4. Nginx负载均衡的五种策略

    nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个. nginx的upstre ...

  5. C++反汇编-继承和多重继承

    学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的内存结构中,父类私有的成员数据依然 ...

  6. configure: error: lzo enabled but missing

    注意:yum安装的无效,需要手动下载源码安装. wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz tar zx ...

  7. Linux下分割、合并文件——dd和cat

    功能说明:读取,转换并输出数据. 语 法:dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=& ...

  8. 快速重启 Quick Boot plus

    Quick Boot(快速启动)可方便快速地重启/关闭您的设备,或将您的设备重启到恢复/引导模式,增强版还实现了热启动和Tasker/Locale插件集成功能.快速重启汉化版 Quick Boot p ...

  9. mysql解决datetime与timestamp精确到毫秒的问题

    CREATE TABLE `tab1` ( `tab1_id` VARCHAR(11) DEFAULT NULL, `create` TIMESTAMP(3) NULL DEFAULT NULL, ` ...

  10. Oracle存储过程update受外键约束的主键值时完整性冲突解决方式

    1.问题背景 尽管在数据库操作中我们并不提倡改动主键,可是确实在实际生活中有这种业务需求: 表A有主键KA,表B中声明了一个references A(KA)的外键约束.我们须要改动A中某条目KA的值而 ...