Qt——复习篇painter

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;
    }

运行结果:

相关推荐
赵钰老师1 小时前
R语言数据统计分析与ggplot2高级绘图
开发语言·数据分析·r语言
多弗朗皮卡丘2 小时前
C语言梦开始的地方3
c语言·开发语言
Quz2 小时前
QML ProgressBar 基础用法:默认样式与平滑动画
qt
繁重的秋春2 小时前
Qt6.0下的CMake的部署配置
qt·cmake
Bonnie_12152 小时前
08-JUC并发基础-AQS-补充共享锁
java·开发语言
qq_401700412 小时前
Qt 程序启动太乱?重新设计你的 Application 生命周期
开发语言·qt
Quz2 小时前
QML Tumbler 自定义滚轮:用 PathView 实现横向选择器
qt
A_cainiao_A2 小时前
【ggml系列】【第四篇】ggml_graph_compute 多线程计算引擎与算子分发源码深度解析
开发语言·c++·矩阵
90后小陈老师2 小时前
从“打开就卡“到“秒开“:一次 PHP GD 动态海报生成的性能优化实战
开发语言·性能优化·php