1、绘制图形只能在paintEvent中写
(1)绘制圆弧:
QPainter painter(this);
painter.setPen(QPen(QColor(11,67,127),3)); //颜色,线条像素
QRectF rect(40.0, 40.0, 100.0, 100.0); //左上角x,左上角y,宽度,高度
painter.setRenderHint(QPainter:: Antialiasing, true); //开启抗锯齿,让圆弧边缘更平滑
painter.drawArc(rect,30*16,150*16); //绘画角度为30°~(30+150°)
painter.drawPoint(40+50,40+50); //绘制中心点
运行结果:

(2)绘制圆形:
QPainter painter(this);
painter.setPen(QPen(QColor(11,67,127),3)); //颜色,线条像素
painter.setRenderHint(QPainter:: Antialiasing, true); //开启抗锯齿,让圆弧边缘更平滑
painter.drawEllipse(40, 40, 100, 100); //左上角x坐标,左上角y坐标,外接矩形的宽度,外接矩形高度
运行结果:

(3)
-
QPainter的坐标是使用的窗口坐标(逻辑坐标,通过setWindow成员函数设置)
QPainter painter(this); QSize ViewWH(100,100); //定义视口宽高 painter.setViewport(50,50,ViewWH.width(),ViewWH.height()); //左上角 x, 左上角 y, 宽度, 高度 painter.setWindow(-50,50,ViewWH.width(),-ViewWH.height()); //setWindow 的 width 和 height 可以是负数 painter.setBrush(QColor(187,229,253)); //浅蓝色填充 painter.setPen(QPen(QColor(11,67,127),2)); //深蓝色边框 painter.drawRect(-50,50,ViewWH.width(),-ViewWH.height()); //绘制矩形,左上角坐标,宽度,高度 painter.drawLine(-50,0,50,0); //起始点坐标和原点坐标 painter.drawLine(0,-50,0,50);
运行结果:

(4)渐变
①QLinearGradient------线性渐变
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
QLinearGradient Linear(100,100,100,200); //垂直渐变,渐变起始点和结束点的坐标
//起始点为0,终点为1
Linear.setColorAt(0,Qt::red);
Linear.setColorAt(1,Qt::blue);
painter.setBrush(Linear); //将渐变设置为画刷
painter.setPen(Qt::transparent); // 设置透明边框(不画轮廓)
painter.drawRect(100,100,100,100); //左上角坐标,宽,高
}
运行结果:

②QradialGradient半径渐变
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.translate(width()/2,height()/2); //将坐标系的原点平移到窗口宽度和高度一半的位置
QRadialGradient Radial(0,0,120,0,0); //设置圆的原点和焦点在中心,半径120
Radial.setColorAt(0,Qt::red);
Radial.setColorAt(0.5,Qt::blue); //设置50%处的半径为蓝色
Radial.setColorAt(1,Qt::green);
painter.setPen(Qt::transparent);
painter.setBrush(Radial); //径向渐变
painter.drawEllipse(-120,-120,240,240); //绘制椭圆,左上角坐标,宽,高
}
运行结果:

③QConicalGradient圆锥渐变
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.translate(width()/2,height()/2);
QConicalGradient Conical(0,0,30); //设置点在中心,角度为30
Conical.setColorAt(0,Qt::red);
Conical.setColorAt(0.5,Qt::blue);
Conical.setColorAt(1,Qt::green);
painter.setPen(Qt::transparent);
painter.setBrush(Conical);
painter.drawEllipse(-120,-120,240,240);
}
运行结果:

(5)QPainter-rotate()函数
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPoint>
#include <QTimer>
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget() override;
private:
QTimer timer;
QPixmap pixmap;
bool m_rotate = false;
protected:
void paintEvent(QPaintEvent *event) override;
QPoint CustomRotate(QPointF point,qreal from_angle,qreal rotate);
private slots:
void timeout();
};
#endif // WIDGET_H
Widget.cpp
#include "Widget.h"
#include <QPainter>
#include <QtMath>
Widget::Widget(QWidget *parent) :
QWidget(parent),
m_rotate(false)
{
resize(300,300);
connect(&timer,SIGNAL(timeout()),this,SLOT(timeout()));
timer.start(40);
}
void Widget::timeout()
{
m_rotate =true;
update();
}
void Widget::paintEvent(QPaintEvent *)
{
static int rotate = 0;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.translate(width()/2,height()/2);
if(m_rotate)
{
rotate = (rotate+5)%360;
m_rotate =false;
}
运行结果:
