【QML COOK】- 006-用C++定义一个QML元素类型

Qt原本是一个C++图形框架,因此QML也少不了C++。QML通常只负责显示,而后台逻辑由C++实现,因此掌握C++和QML之间的交互非常必要。

本例实现一个最简单的例子,用C++定义一个QML的元素类型并在QML使用它。

需求是在窗口上显示鼠标点击的次数。用C++定义了一个Counter的QML元素类型来实现计数。

1. 创建C++类

选择【C++】 -> 【C++ Class】

起个名字,并且选上【Include QObject】【Add Q_OBJECT】【Add QML_ELEMENT】

点击完成

稍微解释一下。

QML是一种声明语言,想用C++定义声明语言的类型,就必须让C++具备反射能力

什么是反射能力

举个最简单的例子,在声明语言中声明一个Counter类型的对象,解释器将代码读到内存后需要根据字符串“Counter”去创建一个Counter类型的C++对象。C++本身显然是不具备这种能力。因此Qt实现了一套让C++实现反射能力的框架。这个框架由一系列类、宏及编译命令配合完成的,因此在创建对象时要选择继承Object类并且添加【Q_OBJECT】【Q_ELEMENT】这两个宏。

2. 查看并修改CMakeList.txt

在CMakeList.txt文件中查找【qt_add_qml_module】,看它是不是如下

qt_add_qml_module(appQT_COOKURI QT_COOKVERSION 1.0QML_FILESMain.qmlSOURCEScounter.cpp counter.h
)

通常添加完C++类后,Qt Create会自动将CMakeList.txt修改为上面那样。如果没有请手动修正,即添加以下内容

    SOURCEScounter.cpp counter.h

这也是为了让C++实现反射能力的操作。

3. 编辑count.h

#ifndef COUNTER_H
#define COUNTER_H#include <QObject>
#include <QQmlEngine>class Counter : public QObject
{Q_OBJECTQML_ELEMENTQ_PROPERTY(int count READ Count WRITE SetCount NOTIFY CountChanged)
public:explicit Counter(QObject *parent = nullptr);void SetCount(const int& count);const int& Count() const;signals:void CountChanged();private:int m_count {0};
};#endif // COUNTER_H

解释一下重要的点

  • 创建的QML元素类型名,同C++名一致。
  • 创建的QML具备哪些属性由Q_PROPERTY声明
Q_PROPERTY(int count READ Count WRITE SetCount NOTIFY CountChanged)

该宏的使用方法可以自行查看Qt帮助文档,这里把使用到的参数介绍一下。

  • int是属性的类型
  • count是属性名称
  • READ Count是告诉QML的解析器调用Count这个方法来获取count的值
  • WRITE SetCount是告诉QML的解析器用SetCount这个方法来更新count的值
  • NOTIFY CountChanged是告诉QML的解析器当count的值发生变化时会发送CountChanged信号

4. 编辑counter.cpp

#include "counter.h"Counter::Counter(QObject *parent): QObject{parent}
{}void Counter::SetCount(const int& count)
{m_count = count;emit CountChanged();
}const int& Counter::Count() const
{return m_count;
}

主要是实现Q_PROPERTY提到的Count和SetCount方法。一定要在SetCount中发送CountChanged这个信号。

5. 编辑Main.qml

import QtQuick
import QT_COOKWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Counter {id: myCounter}MouseArea {anchors.fill: parentonClicked: myCounter.count += 1}Text {id: nametext: myCounter.countanchors.centerIn: parentfont.pointSize: 60}
}
  • import QT_COOK是为了引入Counter类型,因为在CMakeList.txt我们将URL设置成了QT_COOK,所以这里就要引入QT_COOK
  • 创建对象,这里可以理解让C++ 创建一个Counter类型的变量名为myCounter
    Counter {id: myCounter}
  • 在鼠标点击是让myCounter的count属性的值加1
    MouseArea {anchors.fill: parentonClicked: myCounter.count += 1}
  • 让myCounter的count属性的值在窗口中间显示
    Text {id: nametext: myCounter.countanchors.centerIn: parentfont.pointSize: 60}

这里要区分【绑定】和【赋值】两个概念。“text: myCounter.count”的意思是将【text】和【myCounter.count】进行绑定而不是赋值。也就是说【myCounter.count】的值发生变化后【text】的显示也跟着变化。

至于QML的内部实现,猜测是当SetCount方法里发射了信号CountChanged后,QML解析器收到这个信号,就会再次调用Count方法获取更新后的值,然后让text重新渲染。可以在SetCount和Count方法中打印Log验证一下我说的是否正确。或者在SetCount中不再发送信号看看text会不会自动更新

6. 运行程序

每点击一下鼠标数字就会加1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/234952.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19道ElasticSearch面试题(很全)

点击下载《19道ElasticSearch面试题&#xff08;很全&#xff09;》 1. elasticsearch的一些调优手段 1、设计阶段调优 &#xff08;1&#xff09;根据业务增量需求&#xff0c;采取基于日期模板创建索引&#xff0c;通过 roll over API 滚动索引&#xff1b; &#xff08;…

01-你好Python-python环境安装 python解释器的安装 pycharm的安装

python环境安装 官方网址&#xff1a;https://python.org 这里可以下载最新版本的&#xff0c;下载完成以后在自己的浏览器文件下载的文件夹中找到该文件 下载速度可能会比较慢&#xff0c;这里已经提供好了文件&#xff0c;可以直接点击安装 点击Customize installation 点击…

PCL 格网法计算点云的占地面积

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 该方法主要用于粗略统计机载点云的占地面积。方法原理是将点云沿 X O Y XOY

渐进增强与优雅降级:提升用户体验的双重策略

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

外包做了5个月,技术退步一大半了。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

23111 IO进程线程 day8

使用信号灯集完成三个进程的同步&#xff0c;A进程输出字符A&#xff0c;B进程输出字符B&#xff0c;C进程输出字符C&#xff0c;要求输出结果为ABCABCABCABCABC... #include<myhead.h> #include "sem.h"int main(int argc, const char *argv[]) {pid_t pid…

救赎之道,就在其中

时光荏苒&#xff0c;不知不觉距离我踏入职场的第一天已经快一年了。最近也是看到平台举办年度征文活动&#xff0c;借此契机重新审视自己这两年来的成长历程&#xff0c;也希望对正在迷茫的人提供一些精神上的慰藉。 1.对未来的迷茫 如果要给两年前的自己打上标签&#xff0…

【Linux Shell】7. printf 命令

文章目录 【 1. printf 命令的使用方法 】【 2. 实例 】2.1 printf 换行/不换行的区别2.2 格式化控制输出2.3 引号对输出的影响2.4 参数数量对输出的影响 【 1. printf 命令的使用方法 】 printf 命令模仿 C 程序库&#xff08;library&#xff09;里的 printf() 程序&#xf…

python flask图书管理系统带文档

python flask图书管理系统带文档。功能&#xff1a;登录&#xff0c;图书的增删改查&#xff0c;读者管理&#xff0c;借阅记录&#xff0c;有文档。 技术&#xff1a;python3,flask,mysql,html。 包含源码数据库文件文档。 源码下载地址&#xff1a; https://download.csd…

Python画国旗

前言 今天&#xff0c;我们来用turtle库来绘制国旗 一、美国国旗 国旗的形状是长方形;国旗的长宽之比为19:10&#xff0c;美国国旗由红、白、蓝三色组成;画面格局由两部分组成&#xff0c;旗的左上方蓝底上排列着50颗白色的星&#xff0c;6颗一排与5颗一排相间排列&#xff…

Fluids —— Minimal fluid setups

目录 Waterline FLIP Boundary Boundary flow 创建流体设置的三个基本方法&#xff1b; Waterline 由FLIP Container SOP与FLIP Solver SOP组成的基本network&#xff0c;可不需要任何外部源&#xff1b; FLIP Container SOP&#xff0c;能使用不同的容器形状&#xff1b;F…

【SQL】对表中的记录通过时间维度分组,统计出每组的记录条数

场景&#xff1a;一般用作数据统计&#xff0c;比如统计一个淘宝用户在年、月、日的维度上的订单数。 业务&#xff1a;一个集合&#xff0c;以时间维度来进行分组求和。 准备一张订单表order&#xff0c;有一些常规属性&#xff0c;比如创建时间&#xff0c;订单号。 DDL语句如…

一文了解Git(所有命令)附带图片

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…

国产AI工具钉钉AI助理:开启个性化助手服务的新篇章

钉钉AI助理是钉钉平台的一项功能&#xff0c;它可以根据用户的需求提供个性化的AI助手服务。用户可以在AI助理页面一键创建个性化的AI助理&#xff0c;如个人的工作AI助理、旅游AI助理、资讯AI助理等。企业也可以充分使用企业所沉淀的知识库和业务数据&#xff0c;在获得授权后…

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具&#xff0c;10MB 身材的小工具&#xff0c;能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的&#xff0c;非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…

C++学习笔记——对象的指针

目录 一、对象的指针 二、减少对象的复制开销 三、应用案例 游戏引擎 图像处理库 数据库管理系统 航空航天软件 金融交易系统 四、代码的案例应用 一、对象的指针 是一种常用的技术&#xff0c;用于处理对象的动态分配和管理。使用对象的指针可以实现以下几个方面的功…

HTTP介绍

目录 HTTP介绍 1、HTTP 工作原理 2、HTTP 消息结构 3、客户端请求消息 4、服务器响应消息 5、HTTP 请求方法 6、HTTP 响应头信息 7、HTTP 状态码 HTTP介绍 1、HTTP 工作原理 HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发…

2024-01-03 无重叠区间

435. 无重叠区间 思路&#xff1a;和最少数量引爆气球的箭的思路基本都是一致了&#xff01;贪心就是比较左边的值是否大于下一个右边的值 class Solution:def eraseOverlapIntervals(self, points: List[List[int]]) -> int:points.sort(keylambda x: (x[0], x[1]))# 比较…

20、Kubernetes核心技术 - 基于Prometheus和Grafana搭建集群监控平台

目录 一、概述 二、监控平台架构图​编辑 三、部署 Prometheus 3.1、Prometheus简介 3.2、部署守护进程node-exporter 3.3、部署rbac 3.4、ConfigMap 3.5、Deployment 3.6、Service 3.7、验证Prometheus 四、部署Grafana 4.1、Deployment 4.2、Service 4.3、Ing…

12.1SPI驱动框架

SPI硬件基础 总线拓扑结构 引脚含义 DO(MOSI)&#xff1a;Master Output, Slave Input&#xff0c; SPI主控用来发出数据&#xff0c;SPI从设备用来接收数据 DI(MISO) &#xff1a;Master Input, Slave Output&#xff0c; SPI主控用来发出数据&#xff0c;SPI从设备用来接收…