概述

由于QML引擎与Qt元对象系统的紧密集成,任何由QObject派生出来的类其公有的接口或属性都可以从QML代码中轻松访问,并且改动的地方很少,就可以让C++代码定义的功能轻松扩展QML。

任何QML代码都可以访问QObject派生类的实例的以下成员:

  • 属性
  • 方法(用Q_INVOKABLE标记)
  • 信号

另外,如果用Q_ENUMS声明了枚举,那么枚举也是可以直接调用的。
通常来说,QObject类派生于QML类型系统中,都可以从QML访问,但是如果要访问其他类型信息的方式使用某个类,例如,如果该类本身将用作方法参数或属性,那么该类需要注册才能使用,后期将会写相关的文章进行介绍。

Q_PROPERTY()

要想在 QML中调用到 C++的属性,就需要用到Q_PROPERTY宏,该宏就是将 C++属性暴露给QML 调用。
下面来看个简单示例:
首先新建一个类继承于 QObject

#include <QObject>

class Student : public QObject
{Q_OBJECTQ_PROPERTY(QString name READ getName WRITE setName NOTIFY sigNameChanged)
public:explicit Student(QObject *parent = nullptr);~Student(){}void setName(const QString & name){if(name != m_name){m_name = name;emit sigNameChanged(m_name);}}QString getName() const {return m_name;}
signals:void sigNameChanged(QString name);private:QString m_name;
};

该类中用Q_PROPERTY宏将 name 属性暴露出来供 QML 调用。

然后在 main 函数中进行上下文属性注册

int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;Student student;engine.rootContext()->setContextProperty("student", &student);engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

然后在 QML 中进行调用

Window {visible: truewidth: 640height: 480Label{anchors.centerIn: parenttext: student.name}Connections{target: studentonSigNameChanged:{console.log("student name changed",name)}}Component.onCompleted: {student.name = "xiaoming"}
}

为了与QML实现最大的互操作性,任何可写的属性应该有一个关联的NOTIFY信号,每当属性值发生变化时就会发出。
在页面加载完成后Component.onCompleted中去修改 student 的属性,这时候会自动触发信号sigNameChanged,这里将信号连接起来,看看输出效果:

qml: student name changed xiaoming

这就从 QML 轻松的调用到了 C++ 中的属性。

本文就只介绍将简单的 C++系统属性提供给 QML 中调用,后期将介绍更多的类型提供给 QML 使用。
本文示例代码在这里,点击下载。

Qt C++属性类型提供给 QML调用(一)相关推荐

  1. Qt C++属性类型提供给 QML调用(五)

    前言 前面已经介绍了四种从 QML 调用 C++的属性的方法,今天介绍最后一种,从 QML 调用 C++中的函数以及连接 C++中的信号. 调用 C++函数 任何继承于 QObject 类的 C++类 ...

  2. Qt C++属性类型提供给 QML调用(三)

    前言 前面两篇文章已经介绍了 QML 中如何调用 C++中的基础属性以及对象属性,今天继续来介绍另外一种:对象为列表类型的属性调用方法. 概述 包含QObject派生类型列表的属性也可以暴露给QML使 ...

  3. Qt C++属性类型提供给 QML调用(四)

    前言 前面已经介绍了三种关于 QML 调用 C++的属性方法,那么,今天继续介绍一种新的属性调用:分组属性. 分组属性 QML 调用 C++的分组属性,所谓的分组属性, 其实和第二篇文章介绍的调用类属 ...

  4. Qt C++属性类型提供给 QML调用(二)

    概述 在上一篇文章中已经介绍了 QML 中如何调用 C++的基础属性,那么这里来介绍如何调用C++对象类型属性. QML 调用对象类型属性 在上一次的代码基础上直接修改一下, 再添加一个类定义,如下: ...

  5. 使用Golang搭建gRPC服务提供给.NetCore调用

    文章目录 gRPC概述 RPC gRPC又是什么呢 安装 Golang IDE(Goland) Protocol Buffer 下载Protocal Buffer 配置Protocal Buffer编 ...

  6. 46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)

    在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-CSDN博客,知道如何自定义qml键盘后,本章继续来学习. 1.介绍 接下来我们便来自定义一款好看的qml软键盘.如下图 ...

  7. qml调用百度地图api实现卫星地球模式画路书轨迹

    qml调用百度地图api实现卫星地球模式画路书轨迹 总结下类型转换: pro文件中加入依赖的模块 引入头文件 websockettransport.h main文件加入 qml index.html ...

  8. JavaScript 中对象的属性类型

    对象的属性类型 JavaScript 中的对象的属性包括数据属性和访问器属性,在 JavaScript 引擎的内部实现中定义了用于描述属性(property)的特性(attribute).规范中将特性 ...

  9. JavaScript学习随记——属性类型

    <!DOCTYPE HTML> <html><head><meta http-equiv="Content-Type" content=& ...

最新文章

  1. Asp.net支持的最大上传文件大小
  2. 18段代码带你玩转18个机器学习必备交互工具
  3. Linux常用命令及技巧2
  4. LVS、Nginx 及 HAProxy 工作原理
  5. Qt Creator基本使用方法
  6. 深度学习笔记--多层感知器以及BP算法
  7. Web2.0网站性能调优实践(引用王宗义)
  8. linux认证_Linux认证,开放设计原则的政府等等
  9. 前端、后端、全栈都要学什么?薪资前景如何?
  10. windows下cuda10.0+cudnn的配置
  11. 03 聚类算法 - K-means聚类
  12. 开源微信商城java源码_微信小程序商城 带java后台源码
  13. 全国 259GB 离线天地图地名路网数据覆盖范围
  14. http://www.boobooke.com/bbs/thread-10284-1-1.html
  15. 【摘录】Thinkpad T410i-2516A21 安装Ubuntu10.0.4记录
  16. 单片机音乐盒c语言程序代码,基于单片机的八音盒电路原理图和完整程序源代码.doc...
  17. java.util.zip.ZipException: invalid code lengths set解决办法
  18. Git的cherry-pick等一些小知识
  19. HTML的游戏分数怎么设置,HTML5《拯救分号》游戏
  20. 如何实现广告图片总是显示在页面上方,并且随滚动条同步移动?

热门文章

  1. 网易云信三周年:我们只做第一
  2. node.js邮箱注册,激活,登陆相关案例
  3. 公开课视频-《第03章 部署-IT基础架构》-大企业云桌面部署实战-在线培训-视频(奉献)...
  4. sqlite数据库的基本增删改查操作
  5. 对Lucene PhraseQuery的slop的理解[转载]
  6. mongoDB入门必读(概念与实战并重)
  7. C++11 中STL库中新增内容
  8. 免费在线调查系统:调查派 http://www.diaochapai.com/
  9. go程序打包:针对不同OS打包成不同的可执行文件
  10. helm部署minio