main.cpp
#include "widget.h"
#include <QtWidgets>
int main(int argc, char *argv[])
{
#if (QT_VERSION <= QT_VERSION_CHECK(6, 0, 0))
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
Widget类
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QPainterPath>
#include <QWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QSize sizeHint() const override;
protected:
void paintEvent(QPaintEvent *event) override;
protected:
void setSize( );
public:
QTimer *m_timer;
int m_rotate = 0;
QPainterPath leftpath,rightpath;
QPainterPath lefthalfCircle , righthalfCircle;
QPainterPath rightRect,leftRect;
QPainterPath inner1,inner2;
QPainterPath inner11,inner12;
qreal size,R,r,core;
};
#endif
Widget.cpp
#include "widget.h"
#include <QtWidgets>
#define qout if( 1 ) qDebug() << __FUNCTION__ << __LINE__ << ": "
QRectF static makeRectFromCentXY(qreal cx,qreal cy,qreal radius){
return QRectF(cx-radius,cy-radius,radius*2,radius*2);
}
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
m_timer = new QTimer(this);
connect(m_timer,&QTimer::timeout,[this]{
m_rotate += 12;
m_rotate %= 360;
update();
});
m_timer->start(1000/30);
}
Widget::~Widget()
{
}
void Widget::paintEvent(QPaintEvent * event)
{
QPainter painter(this);
painter.fillRect(0,0,width(),height(),Qt::GlobalColor::lightGray);
painter.setRenderHint(QPainter::Antialiasing);
setSize();
int originX = width() /2;
int originY = height()/2;
painter.translate(originX, originY);
leftpath .translate(-R,-R);
rightpath.translate(-R,-R);
inner1.translate(-R, -R);
inner2.translate(-R, -R);
inner11.translate(-R, -R);
inner12.translate(-R, -R);
painter.rotate(m_rotate);
painter.fillPath(leftpath, Qt::white);
painter.fillPath(rightpath, Qt::black);
painter.fillPath(inner11, Qt::black );
painter.fillPath(inner12, Qt::white );
return QWidget::paintEvent(event);
}
void Widget::setSize()
{
size = qMin(width(),height());
size *= 0.8;
R = size/2;
r = R/2;
circle.clear();
leftRect.clear();
rightRect.clear();
leftpath.clear();
rightpath.clear();
inner1.clear();
inner2.clear();
inner11.clear();
inner12.clear();
circle.addEllipse(0,0,size,size);
rightRect.addRect(R,0,R,size);
leftpath = circle - rightRect ;
leftRect.addRect(0,0,R,size);
rightpath = circle - leftRect ;
inner1.addEllipse( makeRectFromCentXY(R, r, r) );
inner2.addEllipse( makeRectFromCentXY(R, r+R, r) );
leftpath += inner1;
rightpath += inner2;
rightpath -= inner1;
leftpath -= inner2;
core = r/3;
inner11.addEllipse( makeRectFromCentXY(R,r,core) );
inner12.addEllipse( makeRectFromCentXY(R,R+r,core) );
}
QSize Widget::sizeHint() const
{
return QSize(300,300);
}