其实实现原理基本上是使用paintEvent进行绘制,在paintevent中绘制时设置变量,自己传入变量值。然后进行update就可以了。
直接看代码
drawpie.h
#ifndef DRAWPIE_H
#define DRAWPIE_H
#include <QWidget>
#include <qtoolbar.h>
#include <QSlider>
class drawpie : public QWidget
{
Q_OBJECT
public:
drawpie(QWidget *parent = nullptr);
~drawpie();
protected:
void paintEvent(QPaintEvent *event);
protected slots:
void setSliderValue();
private:
QSlider *m_slider;
int m_value=0;
};
#endif // DRAWPIE_H
drawpie.cpp
#include "drawpie.h"
#include <QPainter>
#include <QPaintEvent>
#include <QDebug>
#include <QHBoxLayout>
drawpie::drawpie(QWidget *parent)
: QWidget(parent)
{
this->setStyleSheet("background-color:white");
m_slider=new QSlider(this);
connect(m_slider,&QSlider::valueChanged,this,&drawpie::setSliderValue);
m_slider->setRange(0,100);
QHBoxLayout *mainLayout=new QHBoxLayout(this);
mainLayout->addStretch();
mainLayout->addWidget(m_slider);
this->setLayout(mainLayout);
}
drawpie::~drawpie()
{
}
void drawpie::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::transparent,4,Qt::SolidLine));
painter.setRenderHint(QPainter::Antialiasing);
QPainterPath path;
path.addEllipse(0, 0, 200, 200);
path.addEllipse(50, 50, 100, 100);
painter.setBrush( QBrush(QColor("lightblue")) );
painter.drawPath(path);
painter.setBrush(QBrush(QColor("green")));
QRect rect(0,0,200,200);
QRect rect1(50, 50, 100, 100);
painter.drawPie(rect,270*16,3.6*m_value*16);
painter.setBrush(QBrush(QColor("white")));
painter.drawPie(rect1,270*16,3.6*m_value*16);
}
void drawpie::setSliderValue()
{
m_value=m_slider->value();
qDebug()<<"slider::"<<m_value;
update();
}
showwgt.h
#ifndef SHOWWGT_H
#define SHOWWGT_H
#include <QWidget>
#include "drawpie.h"
class ShowWgt : public QWidget
{
Q_OBJECT
public:
explicit ShowWgt(QWidget *parent = nullptr);
~ShowWgt();
signals:
public slots:
private:
drawpie *m_pie[20][10];
};
#endif // SHOWWGT_H
showwgt.cpp
#include "showwgt.h"
#include <qscrollbar.h>
#include <qgridlayout.h>
#include <QScrollArea>
ShowWgt::ShowWgt(QWidget *parent) : QWidget(parent)
{
QScrollArea *area=new QScrollArea(this);
QGridLayout *gridLayout=new QGridLayout(this);
QWidget *containWgt=new QWidget(this);
for(int i=0;i<20;i++)
{
for(int j=0;j<10;j++)
{
m_pie[i][j]=new drawpie(containWgt);
gridLayout->addWidget(m_pie[i][j],i,j);
m_pie[i][j]->setFixedSize(250,200);
}
}
containWgt->setLayout(gridLayout);
area->setWidget(containWgt);
QVBoxLayout *mainLayout=new QVBoxLayout(this);
mainLayout->addWidget(area);
mainLayout->setMargin(0);
this->setLayout(mainLayout);
}
ShowWgt::~ShowWgt()
{
}
main.cpp
#include "drawpie.h"
#include "showwgt.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ShowWgt w;
w.show();
return a.exec();
}
亲测可用。
效果图如下:
有什么不懂的可以在评论区留言 Bye。