QML与C++交互步骤简述

一,  在QML中访问C++类和对象

1)导出类型到QML

第一步 ,实现一个C++类: Class A

实现A的一些条件:

1,从 QObject 或 QObject 的派生类继承

2,使用 Q_OBJECT 宏

(这两个条件是为了让一个类能够进入 Qt 的元对象系统(meta-object system)中,只有使用元对象系统,一个类的某些方法或属性才可能通过字符串形式的名字来调用,才具有了在 QML 中访问的基础条件。)

3,类的成员函数使用 Q_INVOKABLE 宏来修饰,让该方法被元对象系统调用, QML 中用 ${Object}.${method} 来访问.

定义:  Q_INVOKABLE void fun();

QML中, A.fun();

4, 枚举类型用Q_ENUMS宏, QML 中用 ${CLASS_NAME}.${ENUM_VALUE} 的形式来访问

Q_ENUMS(ITEM)

enum ITEM{X,Y,Z};

QML中, A.X;

5,  Q_PROPERTY 宏定义可通过元对象系统访问的属性,可以在 QML 中访问、修改,也可以在属性变化时发射特定的信号。

Q_PROPERTY(QString name READ name WRITE setName) 


第二步: 注册类A到QML类型 (注册动作要放在 QML 上下文创建之前)

qmlRegisterType<A>("an.qt.A", 1, 0, "A");  //参数分别是包名,主版本,次版本,类名


第三步: 在QML中导入注册的类型A

import an.qt.A 1.0 


第四步:在 QML 中创建 A的实例

  1. Rectangle {  
  2.     width: 360;  
  3.     height: 360;  
  4.       
  5.     A {  
  6.         id: a1;  
  7.         name: qsTr("Class A");  
  8.     }  
  9. }  

2)导出对象到QML:

上面是导出QML 类型在 QML中使用,还可以把 C++ 中创建的对象传递到 QML 环境中,然后在 QML 环境中访问

  1. QtQuick2ApplicationViewer viewer;  
  2.       
  3.     viewer.rootContext()->setContextProperty("objectA"new A);  

在QML中使用对象objectA:
  1. Component.onCompleted: {  
  2.         objectA.name = qsTr("Class A");  
  3. objectA.fun();
  4.        ...
  5.     }  

导出的对象可以直接使用,它的信号、槽、可调用方法(使用 Q_INVOKABLE 宏修饰的方法)、属性都可以使用,只是不能通过类名来引用枚举值.

二,在C++使用调用QML对象
1, 实现qml对象 objectb.qml
  1. import QtQuick 2.0  
  2. import QtQuick.Controls 1.1  
  3.   
  4. Rectangle {  
  5.     objectName: "rootRect";  
  6.     width: 360;  
  7.     height: 360;  
  8.     Text {  
  9.         objectName: "textLabel";  
  10.         text: "Hello World";  
  11.         anchors.centerIn: parent;  
  12.         font.pixelSize: 26;  
  13.     }  
  14.   
  15.     Button {  
  16.         anchors.right: parent.right;  
  17.         anchors.rightMargin: 4;  
  18.         anchors.bottom: parent.bottom;  
  19.         anchors.bottomMargin: 4;  
  20.         text: "quit";  
  21.         objectName: "quitButton";  
  22.     }  
  23. }
2, C++中使用对象
  1. int main(int argc, char *argv[])  
  2. {  
  3.     QGuiApplication app(argc, argv);  
  4.   
  5.     QtQuick2ApplicationViewer viewer;  
  6.     viewer.setMainQmlFile(QStringLiteral("qml/callQml/objectb.qml"));  
  7.     viewer.showExpanded();  
  8.   
  9.     QQuickItem * rootItem = viewer.rootObject();  

            QObject * quitButton = rootItem->findChild<QObject*>("quitButton");  
  1.     if(quitButton)  
  2.     {  
  3.         QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit()));  
  4.     }  
  5.   
  6.     QObject *textLabel = rootItem->findChild<QObject*>("textLabel");  
  7.     if(textLabel)  
  8.     {  
  9.         //1. failed call  
  10.         bool bRet = QMetaObject::invokeMethod(textLabel, "setText", Q_ARG(QString, "world hello"));  
  11.         qDebug() << "call setText return - " << bRet;  
  12.         textLabel->setProperty("color", QColor::fromRgb(255,0,0));  
  13.         bRet = QMetaObject::invokeMethod(textLabel, "doLayout");  
  14.         qDebug() << "call doLayout return - " << bRet;  
  15.     }  
  16.   
  17.     return app.exec();  
  18. }  

原博文:http://blog.csdn.net/foruok/article/details/32698603

本文适合于对Qt Quick有基本了解的读者。首先回答一个比较常会被问到的问题:什么是QML,它与Quick的关系是什么? Qt Quick是Qt User Interface Creation Kit的缩写,而QMLQt Quick最重要的组成部分,Qt Quick结合了如下技术: 组件集合,其中大部分是关于图形界面的 基于JavaScript陈述性语言:QMLQt Meta-Object Language的缩写) 用于管理组件并与组件交互C++ API - QtDeclarative模块 言归正传:通过Qt Creator,我们可以轻松生成一个Qt Quick的应用工程,从而为QML生成应用程序框架。具体操作详见:创建qt quick (qml) 应用程序。 C++QML交互是通过注册C++对象给QML环境得以实现的: 在C++实现中,非可视化的型别均为QObject的子类,可视化的类型均为QDeclarativeItem的子类。注意:QDeclarativeItem等同于QML的Item类。 如果用户想要定义自己的型别,做法如下: 在C++中,实现派生于QObject或QDeclarativeItem的子类,它是新定义item的实体对象; 在C++中,将1中实现的新item类型注册给QML; 在QML中,导入含有1中定义的新item的模块; 在QML中,向使用标准的item一样使用新定义的item 现举例说明,我们现尝试使用用Qt C++实现的MyButton对象(如下qml代码),它有自己的属性、方法以及信号的handler。用法如下(它与使用其它标准的QML item一样),所需要做的是 需要导入包含MyButton的对应模块名称及其版本“MyItems 1.0 ”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值