QML与Qt C++ 交互机制探讨与总结

标签: QT QML C++ 交互机制
117人阅读 评论(0) 收藏 举报
分类:

介绍

QML和 C++对象可以通过,signals,slots和 属性修改进行交互。对于一个C++对象,任何数据都可以通过Qt的 Meta-Object System暴露给QML(何总方法,后面介绍),同时,任何的QML对象数据通过Meta-object system在C++端直接访问。
在实际的项目中很多地方会用到QML与Qt C++交互。在这里总结了若干方法供大家参考,欢迎大家指导和拍砖。

在这里不外乎有三种方法:
1. 把Qt C++中的对象或类型暴露给 QML端,供QML端使用。(官方说法是“嵌入”而非“暴露”,比较文明。- -b)
2. QML中的Signal Handler(相当于Qt C++发送信号给QML端,QML端的Signal Handler进行处理)。
3. 在Qt C++端创建QML对象,既然对象都有了。那你想怎么样它就怎么样它呗。(没用过,看起来也不太实用,不过介绍介绍,有用过的同学留言哈)。

好,我们开始吧~

知识准备

别急,让我们先来看看,一些东西,如果您都知道,可以跳过此节。
QML API有三个主要成员——QDeclarativeEngineQDeclarativeComponentQDeclarativeContext

QDeclarativeEngine提供了QML的运行环境。
QDeclarativeComponent封装了QML Documents
QDeclarativeContext允许程序使用QML组件显示数据。

QML包含一个非常好用的API——QDeclarativeView。通过它,应用程序可以很方便的把QML组件嵌入到QGraphicsView中。QDeclarativeView主要用于在应用程序开发过程中进行快速原型开发。

暴露Qt C++的对象或类型给QML

创建需要暴露给QML的数据类型

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QString>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString myString READ myString WRITE setmyString NOTIFY myStringChanged)
public:
explicit MyClass(QObject *parent = 0);
Q_INVOKABLE QString getMyString();
signals:
void myStringChanged();
public slots:
void setmyString(QString aString);
QString myString();
private:
QString m_string;
};
#endif // MYCLASS_H

若你想数据元素中的方法可以被QML直接调用有2种方法:
1. 在函数申明前添加 Q_INVOKABLE 宏。
2. 申明成public slots。

QML可以直接访问改数据元素的属性,该属性由QPROPERTY所申明。
具体实现请参考,示例代码。

暴露已存在的Qt C++对象给QML

//main.cpp
MyClass myObj;
QDeclarativeEngine *engine=viewer.engine();
QDeclarativeContext *context=engine->rootContext();
context->setContextProperty("myObjectExposeByCXProperty", &myObj);

qml中可以直接使用myObjectExposeByCxProperty对象。

//mainpage.qml
...
Button{
...
id:btn1
...
text: qsTr("PROPERTY") 
//此处调用myString为MyClass的QPROPERTY的属性不是方法,所以没有括号。
onClicked: label.text=myObjectExposeByCXProperty.myString;
}
...

注册Qt C++类类型给QML

另外一种方式是注册类型

//main.cpp
qmlRegisterType<MyClass>("RegisterMyType", 1, 0, "MyClassType");

QML中这样使用

//mainpage.qml
...
import RegisterMyType 1.0
Button{
id:btn2
...
text: qsTr("INOVKABLE")
//此处调用的时INVOKABLE的方法,不是属性,所以有括号。
onClicked: label.text=myclassExposeByRegType.getMyString();
}
//创建对象,由于QML是解释执行的,所以放后面也没什么关系。
MyClassType
{
id:myclassExposeByRegType
}

步骤:
1. 导入import。
2. 创建对象。
3. id直接使用。

QML中的Signal Handler

还是使用上面的那例子,在qml中点击按钮控件,改变其中对象的字符串,这时候在Qt C++中发送一个signal信号给qml端,qml端接收到使用signal handler响应,改变label2的值。具体代码如下。
qml中修改string的值。

//mainpage.qml
Button{
id:btn3
text: qsTr("emit stringchanged signal")
onClicked: myObjectExposeByCXProperty.myString="xxxxx"; 
}

Qt C++触发信号

//myclass.cpp
void MyClass::setmyString(QString aString)
{
if(aString==m_string)
{
return;
}
m_string=aString;
emit myStringChanged();
}

连接signal handler响应

//mainpage.qml
Connections
{
target: myObjectExposeByCXProperty
onMyStringChanged:label2.text="Signal handler received" 
}

Qt C++中直接调用QML的函数

同样的QML的函数也可以被Qt C++端调用。
所有的QML函数都通过meta-object system暴露Qt C++端,在Qt C++端可以使用QMetaObject::invokeMethod()方法直接调用。下面就是这样的一个例子。

// MyItem.qml
import QtQuick 1.0
Item {
function myQmlFunction(msg) {
console.log("Got message:", msg)
return "some return value"
}
}
// main.cpp
QDeclarativeEngine engine;
QDeclarativeComponent component(&engine, "MyItem.qml");
QObject *object = component.create();
QVariant returnedValue;
QVariant msg = "Hello from C++";
QMetaObject::invokeMethod(object, "myQmlFunction",
Q_RETURN_ARG(QVariant, returnedValue),
Q_ARG(QVariant, msg));
qDebug() << "QML function returned:" << returnedValue.toString();
delete object;
查看评论

Qt移动应用开发(六):QML与C++的交互

本文主要介绍的是如何使用QML和C++进行交互,难度稍微偏大,适合有经验的Qt开发者进行学习交流。 Qt 5吸收了Qt 4的declarative模块的优点,对底层进行了更改,新建了QP...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2014-07-06 19:36:10
  • 8460

QML界面与Qt/C++代码进行数据交互

QML界面与Qt/C++代码进行数据交互 主要实现2点:      1,c++ 数据传递到QML界面使用 2,QML界面的数据传递到c++代码使用 为了方便说明,我使用QML创...
  • r5014
  • r5014
  • 2017-05-04 11:06:17
  • 1441

C++与 QML 交互-代码

  • 2016年07月20日 17:19
  • 8KB
  • 下载

qml与C++交互传值的简单demo

Qml与C++交互的小例子
  • wkx_boda
  • wkx_boda
  • 2017-02-16 08:53:24
  • 2046

Qt Quick 之 QML 与 C++ 混合编程详解

Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画、各种绚丽效果的 UI 都不在话下。但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket...
  • foruok
  • foruok
  • 2014-07-04 12:22:34
  • 110001

QT C++与QML 交互的那些事 之(你的就是我的我的就是你的)

1.假设 1.在c++中创建一个Person的对象, 2.在QML中获取并显示数据 3.在c++中改变数据后,显示的数据能进行相应的改变 也就是说我们实际是在c++中new一个对象出来,而把这...
  • lihesen
  • lihesen
  • 2012-07-22 12:28:05
  • 2269

QML与C++交互:登陆界面设计

QML与C++交互:登陆界面设计 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5.2.1 ...
  • jdh99
  • jdh99
  • 2014-05-14 10:12:02
  • 18993

qml与c++之间的交互

学习qml的笔记,Qt Quick核心编程的一个例子: 1、实现一个类(从object以及派生类中继承而来),使用Q_OBJECT宏。 #ifndef COLORMAKER_H #define CO...
  • qq_27175513
  • qq_27175513
  • 2016-06-20 14:31:28
  • 792

QML与c++交互方法

介绍 QML和 C++对象可以通过,signals,slots和 属性修改进行交互。对于一个C++对象,任何数据都可以通过Qt的 Meta-Object System暴露给QML(何总方法,后面...
  • WEI_YANG_JU
  • WEI_YANG_JU
  • 2017-10-11 18:20:46
  • 134

QML与C++混合编程详解

 1、QML与C++为什么要混合编程 QML与C++为什么要混合编程,简单来说,就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法,下面介绍了两者间交互的方法与技巧。 2...
  • u012485637
  • u012485637
  • 2015-02-06 19:38:24
  • 1044
    个人资料
    等级:
    访问量: 1553
    积分: 44
    排名: 181万+
    文章分类
    文章存档