Qt之自定义界面组件 一
通过qt中的painter绘图事件绘制一个电池电量图的变化。效果如下图
创建一个基于界面widget工程,在wdiget界面添加一个widget界面,将添加的widget界面的类提升为Tbattery.在Tbattery类中重写painEvent电池电量代码
文件目录结构
主要部分代码
//Tbattery.cpp
#include "tbattery.h"
#include<QPainter>
#include<QPaintEvent>
Tbattery::Tbattery(QWidget *parent)
: QWidget{parent}
{
}
int Tbattery::warningLevel() const
{
return m_warningLevel;
}
void Tbattery::setWarningLevel(int newWarningLevel)
{
m_warningLevel=newWarningLevel;
repaint();
}
int Tbattery::powerLevel() const
{
return m_powerLevel;
}
void Tbattery::setPowerLevel(int newPowerLevel)
{
m_powerLevel = newPowerLevel;
repaint();
}
void Tbattery::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QRect rect(0,0,width(),height());
painter.setViewport(rect);//设置屏幕坐标
painter.setWindow(0,0,120,50);//设置逻辑坐标
painter.setRenderHint(QPainter::TextAntialiasing);
painter.setRenderHint(QPainter::Antialiasing);
QPen pen(colorBorder);
pen.setWidth(1);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::FlatCap);
pen.setJoinStyle(Qt::BevelJoin);
painter.setPen(pen);
QBrush brush(colorBackgroud);
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush);
//绘制边框
rect.setRect(1,1,109,48);
painter.drawRect(rect);
brush.setColor(colorBorder);
painter.setBrush(brush);
rect.setRect(110,15,10,20);
painter.drawRect(rect);
if(m_powerLevel>m_warningLevel)
{
brush.setColor(colorPower);
pen.setColor(colorPower);
}
else
{
brush.setColor(colorWarning);
pen.setColor(colorWarning);
}
painter.setPen(pen);
painter.setBrush(brush);
if(m_powerLevel>0)
{
rect.setRect(5,5,m_powerLevel,40);
painter.drawRect(rect);
}
QString powStr=QString::asprintf("%d%%",m_powerLevel);
QFontMetrics textSize(this->font());
QRect textRect=textSize.boundingRect(powStr);
painter.setFont(this->font());
pen.setColor(colorBorder);
painter.setPen(pen);
painter.drawText(55-textRect.width()/2,25+textRect.height()/2,powStr);
event->accept();
}
//Tbattery.h/
#ifndef TBATTERY_H
#define TBATTERY_H
#include <QWidget>
class Tbattery : public QWidget
{
Q_OBJECT
public:
explicit Tbattery(QWidget *parent = nullptr);
int warningLevel() const;
void setWarningLevel(int newWarningLevel);
int powerLevel() const;
void setPowerLevel(int newPowerLevel);
private:
QColor colorBackgroud=Qt::white;
QColor colorBorder=Qt::black;
QColor colorPower=Qt::green;
QColor colorWarning=Qt::red;
int m_powerLevel = 60;
int m_warningLevel = 20;
signals:
// QWidget interface
protected:
virtual void paintEvent(QPaintEvent *event) override;
};
#endif // TBATTERY_H