本文将通过实现一个点击切换进度的电量指示灯组件和exampleGUI组件库介绍如何基于TinyPiXOS开发新组件。主要内容包括组件开发规范自定义组件开发组件库开发三部分。

组件开发规范

命名规范

采用tp开头命名组件类,名称具备易读性。

目录规范

  • 头文件放置 include/SingleGUI/widgets/
  • 源文件放置 src/SingleGUI/widgets/

代码结构(示例)

使用PIMPL(Pointer to Implementation)设计规范,隐藏实现细节,降低编译依赖性和增强代码稳定性‌。

使用TP_DEF_VOID_TYPE_VAR宏声明管理指针;所有成员变量或函数实现细节封装在cpp中。

tpChildWidget作为所有组件的基类,自定义组件必须继承于tpChildWidget类并包含其头文件。

#include "tpChildWidget.h"
class testLight : public tpChildWidget
{};

示例组件开发

组件介绍:实现一个点击切换进度的电量指示灯

实现步骤

创建自定义组件类testLight

创建testLight.cpptestLight.h文件

组件类需继承于tpChildWidget

#ifndef __TEST_LIGHT_H
#define __TEST_LIGHT_H#include "tpChildWidget.h"
#include "tpEvent.h"class testLight : public tpChildWidget
{
public:testLight(tpChildWidget *parent);virtual ~testLight();
};#endif

定义电量最大格数和当前显示格数变量

int maxCount_;
int count_;

重写onPaintEvent事件,根据电量格数绘制效果

  1. 获取绘制画笔
tpCanvas* painter = event->canvas();
  1. 绘制底色
painter->box(0, 0, width(), height(), _RGB(255, 255, 255));
  1. 根据最大格数计算每个格子的宽度
int spacing = 3;
int singleWidth = (width() - (maxCount_ + 1) * spacing) / maxCount_;
  1. 根据当前电量绘制电量格子
for (int i = 0; i < count_; ++i)
{int drawX = spacing + i * (singleWidth + spacing);painter->box(drawX, spacing, drawX + singleWidth, height() - spacing, _RGB(128, 255, 128));
}

重写 onMousePressEvent 捕获鼠标按下事件,获取鼠标点击状态

bool testLight::onMousePressEvent(tpMouseEvent *event)
{tpChildWidget::onMousePressEvent(event);count_++;if (count_ > maxCount_)count_ = 0;return true;
}

组件测试(使用组件)

testLight* light = new testLight(this);
testButton_->setSize(200, 50);
testButton_->move(150, 300);

演示效果

初始化效果

初始化

点击组件,增加颜色块

点击增加电量格

完整源码

头文件:testLight.h

#ifndef __TEST_LIGHT_H
#define __TEST_LIGHT_H#include "tpChildWidget.h"
#include "tpEvent.h"class testLight : public tpChildWidget
{
public:testLight(tpChildWidget *parent);virtual ~testLight();public:virtual bool onMousePressEvent(tpMouseEvent *event) override;virtual bool onPaintEvent(tpObjectPaintEvent *event) override;private:int maxCount_;int count_;
};#endif

源码:testLight.cpp

#include "testLight.h"
#include "tpCanvas.h"testLight::testLight(tpChildWidget *parent): tpChildWidget(parent), maxCount_(4), count_(0)
{
}testLight::~testLight()
{
}bool testLight::onMousePressEvent(tpMouseEvent *event)
{tpChildWidget::onMousePressEvent(event);count_++;if (count_ > maxCount_)count_ = 0;return true;
}bool testLight::onPaintEvent(tpObjectPaintEvent *event)
{tpChildWidget::onPaintEvent(event);tpCanvas *painter = event->canvas();painter->box(0, 0, width(), height(), _RGB(255, 255, 255));int spacing = 3;int singleWidth = (width() - (maxCount_ + 1) * spacing) / maxCount_;for (int i = 0; i < count_; ++i){int drawX = spacing + i * (singleWidth + spacing);painter->box(drawX, spacing, drawX + singleWidth, height() - spacing, _RGB(128, 255, 128));}return true;
}

组件库介绍

当业务需求实现一整套统一样式风格的GUI样式库时,可以使用组件库的形式对相同样式风格的组件进行统一管理,方便后期扩展及维护。未来tinyPiXOS会提供各种样式风格的组件库,并以当前规范进行发布。

本节将创建一个名为exampleGUI的组件库,同时对testLight组件进行改造,将其加入exampleGUI组件库。

目录结构说明

组件库开发需要遵循目录结构规范,将组件库的头文件、源码文件、构建文件等分类放入指定文件夹。并且需要创建FrameworkGlobal.h放置组件库全局定义,及命名空间声明。目录结构规范如下:

tinyPiXCore/
└─ PiXGUIFramework/├─ exampleGUI/│  ├─ CMakeList.txt│  └─ CMakePresets.json└─ src/├─ include/│  └─ GUIFramework/│     └─ exampleGUI/│        └─ widgets/│           └─ testLight.h└─ src/└─ GUIFramework/└─ exampleGUI/└─ widgets/└─ testLight.cpp

定义框架命名空间

编辑FrameworkGlobal.h

#ifndef _EXAMPLE_GUI_GLOBAL_H
#define _EXAMPLE_GUI_GLOBAL_H#define EXAMPLE_GUI_NAMESPACE_BEGIN namespace exampleGUI {
#define EXAMPLE_GUI_NAMESPACE_END }#endif

重构testLight类

使用PIMPL隐藏设计实现

这里我们将已经开发好的点击切换进度的电量指示灯组件加入exampleGUI组件库。

重构头文件:testLigh.h

#ifndef __TEST_LIGHT_H
#define __TEST_LIGHT_H#include "tpChildWidget.h"
#include "tpEvent.h"
#include "FrameworkGlobal.h"EXAMPLE_GUI_NAMESPACE_BEGINTP_DEF_VOID_TYPE_VAR(ItestLightData);
class testLight : public tpChildWidget
{
public:testLight(tpChildWidget *parent);virtual ~testLight();public:virtual bool onMousePressEvent(tpMouseEvent *event) override;virtual bool onPaintEvent(tpObjectPaintEvent *event) override;private:ItestLightData *data_;
};EXAMPLE_GUI_NAMESPACE_END#endif

重构源代码:testLigh.cpp

#include "testLight.h"
#include "tpCanvas.h"EXAMPLE_GUI_NAMESPACE_BEGINstruct testLightData
{int maxCount_;int count_;testLightData() : maxCount_(0), count_(0){}
};testLight::testLight(tpChildWidget *parent): tpChildWidget(parent)
{testLightData *lightData = new testLightData();lightData->maxCount_ = 4;lightData->count_ = 0;data_ = lightData;
}testLight::~testLight()
{testLightData *lightData = static_cast<testLightData *>(data_);if (lightData){delete lightData;lightData = nullptr;data_ = nullptr;}
}bool testLight::onMousePressEvent(tpMouseEvent *event)
{tpChildWidget::onMousePressEvent(event);testLightData *lightData = static_cast<testLightData *>(data_);lightData->count_++;if (lightData->count_ > lightData->maxCount_)lightData->count_ = 0;return true;
}bool testLight::onPaintEvent(tpObjectPaintEvent *event)
{tpChildWidget::onPaintEvent(event);testLightData *lightData = static_cast<testLightData *>(data_);tpCanvas *painter = event->canvas();painter->box(0, 0, width(), height(), _RGB(255, 255, 255));int spacing = 3;int singleWidth = (width() - (lightData->maxCount_ + 1) * spacing) / lightData->maxCount_;for (int i = 0; i < lightData->count_; ++i){int drawX = spacing + i * (singleWidth + spacing);painter->box(drawX, spacing, drawX + singleWidth, height() - spacing, _RGB(128, 255, 128));}return true;
}EXAMPLE_GUI_NAMESPACE_END

测试使用(使用组件库)

CMakeList引入exampleGUI头文件目录和引入动态库引用

include_directories(/usr/include/tinyPiX/GUIFramework)
target_link_libraries(examplesApp exampleGUI)

为防止多个UI框架头文件重复导致引用异常,请使用UI框架的父级目录引入。

#include"exampleGUI/widgets/testLight.h"

使用方式同上一节自定义组件

注:需添加命名空间引入

exampleGUI::testLight* light = new exampleGUI::testLight(this);
testButton_->setSize(200, 50);
testButton_->move(150, 300);

TinyPiXOS开发者联盟

​源码级支持 + 真实项目:TinyPiXOS开发者联盟招募中​。

开发资料

关注我们

官网网站
技术资料
视频合集

感谢支持和关注,如果对项目感兴趣,请点赞、收藏和转发!

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

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

相关文章

主流熔断方案选型指南

主流熔断方案选型1. Netflix Hystrix (经典但已停止维护)适用场景&#xff1a;传统Spring Cloud项目&#xff0c;需要快速集成熔断功能优点&#xff1a;成熟稳定&#xff0c;社区资源丰富与Spring Cloud Netflix套件无缝集成提供熔断、降级、隔离等完整功能缺点&#xff1a;已停…

Django中get()与filter()对比

在 Django 中&#xff0c;get() 和 filter() 是 QuerySet API 中用于检索数据的两个核心方法&#xff0c;它们的功能和使用场景有明显区别。以下是详细对比&#xff1a; 1. 核心区别特性get()filter()返回值单个对象&#xff08;模型实例&#xff09;查询集&#xff08;QuerySe…

MySQL锁(一) 概述与分类

1.1 MySQL锁的由来 客户端发往 MySQL 的一条条 SQL 语句&#xff0c;实际上都可以理解成一个个单独的事务&#xff08;一条sql语句默认就是一个事务&#xff09;。而事务是基于数据库连接的&#xff0c;每个数据库连接在 MySQL 中&#xff0c;又会用一条工作线程来维护&#x…

PyTorch里的张量及张量的操作

张量的简介 张量是多重线性映射在给定基下的坐标表示&#xff0c;可视为向量和矩阵的泛化。 0 维张量&#xff1a;标量&#xff08;如 5&#xff09;1 维张量&#xff1a;向量&#xff08;如 [1, 2, 3]&#xff09;2 维张量&#xff1a;矩阵&#xff08;如 [[1, 2], [3, 4]]&…

向量数据库Faiss vs Qdrant全面对比

Faiss vs Qdrant 全面对比表 向量数据库是一种相对较新的方式,用于与来自不透明机器学习模型(如深度学习架构)派生的抽象数据表示进行交互。这些表示通常被称为向量或嵌入(embeddings),它们是用于训练机器学习模型完成诸如情感分析、语音识别、目标检测等任务的数据的压…

2025年AIR SCI1区TOP,缩减因子分数阶蜣螂优化算法FORDBO,深度解析+性能实测

目录1.摘要2.蜣螂优化算法DBO原理3.改进策略4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 传统DBO存在探索与开发能力失衡、求解精度低以及易陷入局部最优等问题。因此&#xff0c;本文提出了带有缩减因子分数阶蜣螂优化算法&#xff08;FORDBO&#xff0…

爬虫逆向之JS混淆案例(全国招标公告公示搜索引擎 type__1017逆向)

案例https://ctbpsp.com/#/ 截至2025.07.19可用 定位加密位置 加密位置&#xff1a; 定位方式&#xff0c;XHR&#xff0c;跟栈 跟栈 QL打断点&#xff0c;重新断住 分析为&#xff0c;一个函数传入四个参数 var QL QI[d9(Nv.mQ)](QJ, Qh, Qv, this[d9(Nv.m9)][0xa1a * …

Hive常用命令总结

一、数据库操作 -- 创建数据库&#xff08;默认路径&#xff09; CREATE DATABASE IF NOT EXISTS myhive;-- 指定路径创建数据库 CREATE DATABASE myhive2 LOCATION /myhive2;-- 查看数据库信息 DESC DATABASE myhive;-- 删除数据库&#xff08;强制删除表&#xff09; DROP DA…

Spring整合MyBatis详解

Spring整合MyBatis详解一、整合优势与核心思路1.1 整合优势1.2 核心整合思路二、环境搭建与依赖配置2.1 开发环境2.2 Maven依赖配置三、整合配置&#xff08;核心步骤&#xff09;3.1 数据库配置文件&#xff08;db.properties&#xff09;3.2 Spring配置文件&#xff08;sprin…

Windows CMD(命令提示符)中最常用的命令汇总和实战示例

CMD命令汇总 下面是 Windows CMD&#xff08;命令提示符&#xff09;中最常用的命令汇总&#xff0c;共 30 个&#xff0c;包含说明和典型代码示例&#xff0c;适合日常开发、系统操作、文件管理、网络诊断等场景。一、文件与目录操作&#xff08;最常用&#xff09;命令说明示…

嵌入式硬件篇---舵机(示波器)

舵机是一种高精度的角度控制执行器件&#xff0c;广泛应用于机器人、航模、自动化设备等领域。其核心特点是能通过控制信号精准定位到特定角度&#xff08;通常范围为 0-180&#xff0c;部分可到 360 连续旋转&#xff09;。常见的舵机类型可根据结构、控制方式、用途等维度划分…

嵌入式硬件篇---按键

按键是电子系统中最基础的人机交互部件&#xff0c;通过机械或电子方式实现电路通断或状态切换。根据结构和工作原理的不同&#xff0c;常见按键可分为机械按键、薄膜按键、触摸按键等&#xff0c;以下详细介绍其工作原理、应用场景及电路特点&#xff1a;一、机械按键&#xf…

试用SAP BTP 06:AI服务-Data Attribute Recommendation

创建实例 方法一&#xff1a;BTP主控室-子账户-服务市场 输入实例配置信息&#xff0c;下一步 不用参数&#xff0c;下一步 审核实例&#xff0c;点击创建 实例创建完成后&#xff0c;创建服务键值 输入键值名称&#xff0c;点击 创建 方法二&#xff08;建议&#xff09;&…

训诂学中的“形音义互求”对NLP、知识图谱、注意力机制的启示

一、训诂学与现代人工智能结合的学术价值与技术潜力1. ​​训诂学的核心优势与AI语义分析的契合点​​训诂学作为中国传统学术中研究古代文献语义的核心学科&#xff0c;其方法论和理论框架对自然语言处理&#xff08;NLP&#xff09;的深层语义分析具有深刻的启发性和技术补充…

http基础一

1. HTTP是什么&#xff1f; HTTP&#xff08;超文本传输协议&#xff0c;HyperText Transfer Protocol&#xff09;是一种用于从万维网服务器传输超文本到本地浏览器的协议。它是无状态的客户端-服务器协议&#xff0c;通常在Web浏览器和Web服务器之间用于传输网页、图片、视频…

西门子 S7-1500 系列 PLC CPU 选型全指南:从类型到实战

在西门子 S7-1500 系列 PLC 的系统构建中&#xff0c;CPU 作为核心控制单元&#xff0c;其选型直接决定了自动化系统的性能、功能扩展性和适用场景。本文将系统解析 S7-1500 系列 CPU 的类型划分、核心参数、典型型号功能及选型流程&#xff0c;助你精准匹配工业控制需求。一、…

PaddleOCR 与 PaddleX 调试

PaddleOCR 与 PaddleX 调试1.安装1.1 环境准备1.2用Conda创建虚拟环境2.测试2.1发票测试2.2 手写汉字识别3.PaddleOCR 与 PaddleX 对比3.1 基于 PaddleX 部署 OCR 服务1.安装 PP OCR 文档 1.1 环境准备 根据自己操作系统按网上指导安装 ccache ccache --version是否已安装 …

imx6ull-系统移植篇11——U-Boot 移植(下)

目录 前言 移植过程 添加开发板默认配置文件 添加开发板对应的头文件 添加开发板对应的板级文件夹 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 图形界面配置文件 编译 uboot LCD 驱动修改 修改源文件 修改头文…

30天打牢数模基础-模拟退火算法讲解

二、完整Python代码 import random import mathdef rastrigin(x, y):"""二维Rastrigin函数&#xff08;目标函数&#xff0c;需最小化&#xff09;参数&#xff1a;x: 自变量xy: 自变量y返回&#xff1a;函数值f(x,y)"""return 20 x**2 y**2 …

论文阅读 - FastInst

文章目录1 概述2 模型说明2.1 总体架构2.2 轻量pixel decoder2.3 实例激活引导的Query2.4 双路径更新策略2.5 GT掩码引导学习2.6 损失函数3 效果1 概述 FastInst是一种基于query的实时实例分割方法&#xff0c;它能以32.5FPS的实时速度在COCO测试集上达到40.5的AP。在实例分割…