TinyPiXOS組件開發(一):開發規范、組件開發方法介紹,快速上手組件開發,創造各種有趣的UI組件!

本文將通過實現一個點擊切換進度的電量指示燈組件和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。在實例分割…