widget.h
#pragma once
#include <QtWidgets/QWidget>
#include <QTimer>
#include <QVector>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void paintEvent(QPaintEvent *event) override;
void timerEvent(QTimerEvent *event) override;
private:
int timerId;
int dashes;
int spaces;
int dash_offset;
int step;
QVector<qreal> dashPattern;
};
widget.cpp
#include "widget.h"
#include <QPainter>
#include <QTimerEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, dash_offset(0)
{
dashes = 5;
spaces = 5;
step = 1;
dashPattern << dashes << spaces;
timerId = startTimer(150);
}
Widget::~Widget()
{
}
void Widget::timerEvent(QTimerEvent *event)
{
if (event->timerId() == timerId)
{
dash_offset = (dash_offset + step) % (dashes + spaces);
update(); // 更好的方式是更新蚂蚁线的所在的范围,而不是整个界面都刷新,用 update(rect)
}
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QPen pen;
pen.setDashPattern(dashPattern); // 蚂蚁线的 style
pen.setDashOffset(dash_offset);
//draw rect
painter.translate(20, 20);
painter.setPen(pen);
painter.drawRect(0, 0, 100, 100);
//draw path
QPainterPath path;
path.cubicTo(50, 0, 50, 100, 100, 100);
path.cubicTo(150, 0, 150, 100, 200, 0);
painter.translate(120, 0);
painter.setPen(pen);
painter.drawPath(path);
}