写在前面

本文适合有一定Qt及HTML经验的人阅读。

Qt(C++)和QML间交互

想要了解Qt(C++)和QML间的信息交互,就不得不提到Qt的信号与槽机制。

信号与槽

信号与槽是qt的特有信息传输机制。它本质上是一种观察者模式。当某个事件触发时,它就会发出一个类似广播的信号。如果有对象对这个信号感兴趣,它就使用连接函数,将想要处理的信号和自己的一个函数(qt中成为槽)绑定来进行处理。当信号发出时,槽函数就会自动被执行。

我们通过一个例子来进行说明。

类的定义

首先,我们定义一个c++的类,该类需要继承QObject类,这样才有信号槽的能力。同时,需要在该类中添加Q_OBJECT宏。例:

#include 

使用Q_PROPERTY定义属性,该属性可被qml使用。它还具有一些附加特性:READ用于读属性的值;WRITE用于设置属性的值;NOTIFY则定义一个信号,该信号用来表示属性发生改变。信号会携带一个参数,表示属性的新值。l例如:

Q_PROPERTY

绑定槽函数

QT使用connect函数来绑定信号和槽,例:

connect

上面代码中,当有mystringChanged信号发出时,onMystringChanged函数就是被执行。信号与槽机制不仅可以用来进行c++类之间的通信,也可以用来实现c++和qml之间的通信,我们继续使用上面的例子来说明。

信号发送

当mystring有变化时,会触发setString回调。我们可以在setString函数中触发mystringChanged信号。

void 

将类注册到QML中

QT使用qmlRegisterType方法将类注册到QML中,例:

qmlRegisterType

其中,第一个参数是作为QML中引用的url;第二个参数是主版本号;第三个参数是次版本号;第四个参数是QML中使用的元素名称。本例中,QML模块可以使用下面方法引用该类,例:

import RegisterMyType 1.0

QML中对象创建

经过上面的步骤之后,我们就可以直接在QML中创建MyClassType对象了。例:

MyClassType {id: myobj
}

QML中连接信号

对象创建成功后,我们可以为QML绑定感兴趣的信号了。

Connections {target: myobj;onMystringChanged: {// 这里的value是signal信号函数里面的参数console.log("value: " + value)}
}

QML直接使用对象

除了上面的方法,我们还可以通过直接使用对象的方式,来进行信号的绑定。在上面的例子中,我们可以下面的方式,我们首先在C++代码中做如下声明:

QQmlApplicationEngine 

其中,QQmlComponent用来封装QML组件。需要注意的是,MyClass.qml中,需要使用上面讲到的MyClassType作为顶层元素。 setContextProperty函数定义暴露给QML的对象。第一个参数是QML中使用的对象名称,相当于重命名,可在QML中直接使用;第二个参数暴露给QML的对象。而信号的绑定,只需要将上面讲到的Connections中的target修改为myQmlClass即可。即:

Connections {target: myQmlClass;onMystringChanged: {// 这里的value是signal信号函数里面的参数console.log("value: " + value)}
}

Qt和HTML间交互

Qt和HTML间的交互式通过WebChannel来实现的。

WebChannel

WebChannel提供一种机制使得QObject或者QML访问HTML。所有的属性,信号和公共的槽函数都可以被HTML使用。

WebChannel由一些属性和方法组成。

属性包括:

registeredObjects

A list of objects which should be accessible to remote clients.

The objects must have the attached id property set to an identifier, under which the object is then known on the HTML side.

Once registered, all signals and property changes are automatically propagated to the clients. Public invokable methods, including slots, are also accessible to the clients.

If one needs to register objects which are not available when the component is created, use the imperative registerObjects method.

简单翻译一下:

这是一个提供给HTML访问的object列表。

object需要有id标识,这样才能被HTML识别。

object一旦被注册,所有的信号和属性的改变都会被自动传递到客户端。还包括公共的方法和槽。

如果组件创建时object还不可用,可以使用registerObject方法。

transports

A list of transport objects, which implementQWebChannelAbstractTransport. The transports are used to talk to the remote clients.

一个传输列表,实现了QWebChannelAbstractTransport类。用来跟客户端交互。

其它方法具体不再赘述,可以参考后面的参考文献。这里我们主要讲一下registeredObjects的用法。

registeredObjects提供给HTML访问的object列表。object须声明id属性,这样HTML才能知道它;同时,object要声明WebChannel.id,HTML使用该id访问对象。

QtObject定义如下:

QtObject {id: myObjectWebChannel.id: "myWebObject"property string name: "QtObjectName"signal onMystringChanged(var myStr)
}

WebChannel定义如下:

WebChannel {id: myChannelregisteredObjects: [myObject]
}

WebEngineView

WebChannel声明好之后,下面就是如何使用它。我们定义WebEngineView元素,用来加载HTML文件,并指定关联的WebChannel,使用方式如下:

WebEngineView {id: webViewurl: "./map.html"webChannel: myChannel
}

至此,QML端的工作就已经完成了。下面讲一下如何在HTML端使用WebChannel。

引入qwebchannel.js库

HTML想要使用QWebChannel,需要先引用qwebchannel库,这是一个JavaScript类库,使用方式如下:

<

然后在增加如下代码:

new QWebChannel(qt.webChannelTransport, function(channel) {var myClass = channel.objects.myClass;var myObject = channel.objects.myWebObject;myObject.onMystringChanged.connect(function(myStr) {console.log(myStr);});
});

总结

信号与槽机制是Qt的核心思想,我们需要加深理解,在实际应用中灵活使用。

这里只讲了C++和QML,QML和HTML间的交互。C++和HTML间也可以直接交互,以后有时间再来跟大家一起分享。

能力有限,如果错误之处,请不吝赐教,谢谢。

参考:

https://doc.qt.io/qt-5.9/qml-qtwebchannel-webchannel.html

qml c++函数 slot_浅析Qt(C++),QML与HTML之间的交互相关推荐

  1. Qt Quick Qml 之QML与C++ 混合编程学习

    <QML与C++ 混合编程学习> 1. 在 QML 中使用 C++ 类和对象 1) C++ 类的修改 2) 注册 QML 类型 3) 在 QML 中导入类型 4) 在 QML 创建由 C+ ...

  2. Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程、翻译、QSetting )【建议收藏】

    文章目录 一.开门见山 二.最基本的框架(v0.1) 1. 后端数据处理 2. 导出 C++ 对象的 QML 的属性 3. 前台 UI 数据 三.完善执行逻辑(v0.2) 四.发布版本(v1.0) 1 ...

  3. QT Quick QML 实例之 Popup 弹出界面

    QT Quick QML 实例之 Popup 弹出界面 一.演示 二.实现过程 1. 居中弹出 2. 正下方弹出 所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧! GIT工程文件 ...

  4. QT Quick Qml 实例——滑块拖动颜色框的平移(Gradient、drag、clip、transform、antialiasing)

    <实例--滑块拖动颜色框的平移> 1. 简介 2. 详解 所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧! QML其它文章请点击这里:     QT QUICK QM ...

  5. QT集成QML和JavaScript

    QT 集成QML和JavaScript 集成QML和JavaScript JavaScript表达式 JavaScript资源 JavaScript导入 JavaScript主机环境 精调JavaSc ...

  6. Qt与QML的枚举绑定(C++枚举)

    Qt到QML的枚举绑定 QML中是不支持c++的枚举类型的,所以我们可以使用Qt的元对象系统,即MOS,来帮助我们实现. 进行绑定的好处就是,以后数据发生变化的时候,就是枚举发生增加修改,添加等的时候 ...

  7. python qt信号在qml 的使用_Python和C++混合使用QML开发GUI

    pyqt和qml结合的中文资很少,在baidu上搜索,基本上就是浪费时间.在国外的blog上,有零星的几篇,但是介绍好的少.在stackoverflow上看到一篇关于pyside,发现pyside,发 ...

  8. Qt Quick QML

    Qt Quick简介 Qt Quick是一个用于帮助开发者设计直观,现代,流畅的用户界面的技术集,近年来被广泛应用于手机,媒体播放器,机顶盒和其他手提设备.Qt Quick中包含了大量的用户界面元素, ...

  9. QT之Qml使用QSystemTrayIcon实现系统托盘

    系统托盘图标,现代操作系统通常在桌面上提供一个特殊区域,称为系统托盘或通知区域,长时间运行的应用程序可以在其中显示图标和短消息.网上找到的例子大多太凌乱,这里总结下提供个代码封装,方便后续用到了简单使 ...

最新文章

  1. 理解MySQL——复制(Replication)
  2. day5-shutil模块
  3. python修改y轴刻度_Python | Y轴刻度限制
  4. ubuntupython损坏_修复损坏的Python3.2安装(Ubuntu)
  5. LiteOS内核源码分析:任务LOS_Schedule
  6. k8s部署nacos
  7. Win10 CMD命令大全与超好用的快捷键
  8. sx1276, sx1278, Si4463, Si4432, Si4438, sx1212小无线模块对比数据
  9. 手把手搭建K3cloud插件开发环境
  10. django使用python-decouple
  11. VisionPro如何引用VPP?
  12. 2021第一学期学习笔记01
  13. Javascript 中 atob 方法解码中文字符乱码问题
  14. 计算机技能大赛 英语,计算机科学与技术学院英语技能大赛圆满结束
  15. 一步一步实现一款实用的Android广告栏
  16. Kubernetes Dashboard 设置用户密码登陆
  17. PMP到底是啥,你竟然还不知道?
  18. 匹配包含换行符(回车)的任意字符串的正则表达式
  19. 编程猫创作工具:新版Kitten新体验
  20. ssd测试软件和实际 速度,测出真相!实测CPU/内存对SSD性能的影响

热门文章

  1. 【Level 08】U06 Good Feeling L1 End-of-season game
  2. android gps 案例_GPS学习要点10
  3. VS2010平台下OpenCV编译和安装
  4. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(2)
  5. 2019量子计算机上市公司,2019年第一炮:量子计算机终于来了!
  6. 微信小程序 --- 获取网络状态
  7. ubuntu_python_environment
  8. mybatis11--多对多关联查询
  9. Java中的queue和deque对比详解
  10. glibc库详解及与POSIX,system V这些库之间关系的说明