自定义组件
约 606 字大约 2 分钟
2025-07-17
组件开发
实现一个点击切换进度的电量指示灯。
步骤如下所示:
- 创建自定义组件类
创建TestLight.cpp和TestLight.h文件
- 组件类需继承于TpWidget
#ifndef __TEST_LIGHT_H
#define __TEST_LIGHT_H
#include "TpWidget.h"
#include "tpEvent.h"
class TestLight : public TpWidget
{
public:
TestLight(TpWidget *parent);
virtual ~TestLight();
};
#endif- 定义电量最大格数和当前显示格数变量
int maxCount_;
int count_;重写onPaintEvent事件,根据电量格数绘制效果
- 获取绘制画笔
TpPainter* painter = event->painter();- 绘制底色
painter->setPen(_RGB(255, 255, 255)); painter->setBrush(TpBrush(_RGB(255, 255, 255))); painter->drawRect(0, 0, width(), height());- 根据最大格数计算每个格子的宽度
int spacing = 3; int singleWidth = (width() - (maxCount_ + 1) * spacing) / maxCount_;- 根据当前电量绘制电量格子
painter->setPen(_RGB(128, 255, 128)); painter->setBrush(TpBrush(_RGB(128, 255, 128))); for (int i = 0; i < count_; ++i) { int drawX = spacing + i * (singleWidth + spacing); painter->drawRect(drawX, spacing, singleWidth, height() - spacing * 2); }重写 onMousePressEvent 捕获鼠标按下事件,获取鼠标点击状态
bool TestLight::onMousePressEvent(TpMouseEvent *event)
{
TpWidget::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 "TpWidget.h"
#include "tpEvent.h"
class TestLight : public TpWidget
{
public:
TestLight(TpWidget *parent);
virtual ~TestLight();
public:
virtual bool onMousePressEvent(TpMouseEvent *event) override;
virtual bool onPaintEvent(TpPaintEvent *event) override;
private:
int maxCount_;
int count_;
};
#endifTestLight.cpp
#include "TestLight.h"
#include "TpPainter.h"
TestLight::TestLight(TpWidget *parent)
: TpWidget(parent), maxCount_(4), count_(0)
{
}
TestLight::~TestLight()
{
}
bool TestLight::onMousePressEvent(TpMouseEvent *event)
{
TpWidget::onMousePressEvent(event);
count_++;
if (count_ > maxCount_)
count_ = 0;
return true;
}
bool TestLight::onPaintEvent(TpPaintEvent *event)
{
TpWidget::onPaintEvent(event);
TpPainter *painter = event->painter();
painter->setPen(_RGB(255, 255, 255));
painter->setBrush(TpBrush(_RGB(255, 255, 255)));
painter->drawRect(0, 0, width(), height());
int spacing = 3;
int singleWidth = (width() - (maxCount_ + 1) * spacing) / maxCount_;
painter->setPen(_RGB(128, 255, 128));
painter->setBrush(TpBrush(_RGB(128, 255, 128)));
for (int i = 0; i < count_; ++i)
{
int drawX = spacing + i * (singleWidth + spacing);
painter->drawRect(drawX, spacing, singleWidth, height() - spacing * 2);
}
return true;
}