绘制需在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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected:void paintEvent(QPaintEvent *event) override;
private:Ui::Widget *ui;QTimer *timer;};
#endif // WIDGET_H