Qt QPaintEvent绘图事件painter使用指南

绘制需在paintEvent函数中实现

用图片形象理解

如果加了刷子再用笔就相当于用笔画过的区域用刷子走

防雷达:

源文件

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,[=]{
        update();
    });
    timer->start(10);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
    static int i = 0;
    qDebug() << "painterEvent" << i++;
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);//抗锯齿
    QBrush brush(Qt::black);
    painter.setBrush(brush);
    painter.drawRect(rect());
    painter.setBrush(Qt::NoBrush);//画刷只用一次否则会覆盖
    QPen pen(Qt::green,3);
    painter.setPen(pen);
    painter.translate(rect().center());//原点移到矩形正中央
    painter.drawEllipse(QPoint(0,0),7*height()/14,7*height()/14);
    painter.drawEllipse(QPoint(0,0),6*height()/14,6*height()/14);
    painter.drawEllipse(QPoint(0,0),5*height()/14,5*height()/14);
    painter.drawEllipse(QPoint(0,0),4*height()/14,4*height()/14);
    painter.drawEllipse(QPoint(0,0),3*height()/14,3*height()/14);
    painter.drawEllipse(QPoint(0,0),2*height()/14,2*height()/14);
    painter.drawEllipse(QPoint(0,0),1*height()/14,1*height()/14);
    painter.drawLine(-height()/2,0,height()/2,0);
    painter.drawLine(0,-height()/2,0,height()/2);
    QConicalGradient conicalGradient(0,0,30-i);
    conicalGradient.setColorAt(0,QColor(0,255,0,200));
    conicalGradient.setColorAt(0.1,QColor(0,255,0,100));
    conicalGradient.setColorAt(0.2,QColor(0,255,0,0));
    conicalGradient.setColorAt(1,QColor(0,255,0,0));
    //画笔加刷划过去
    painter.setBrush(conicalGradient);
    painter.setPen(Qt::NoPen);
    painter.drawPie(QRect(-height()/2,-height()/2,height(),height()),(30-i)*16,70*16);
    if (i==360) i=0;
}

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QTimer>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    void paintEvent(QPaintEvent *event) override;
private:
    Ui::Widget *ui;
    QTimer *timer;

};
#endif // WIDGET_H