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

运行结果:

相关推荐
FfHUCisI6 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI6 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
lemon_sjdk7 小时前
ObjectProperty
java·开发语言·算法
大模型码小白7 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
hh9507 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区
「QT(C++)开发工程师」8 小时前
C++ std::move 详解
开发语言·c++
matlab代码8 小时前
基于matlab的玉米种子计数设计(GUI界面)【源码58期】
开发语言·matlab
c#上位机8 小时前
C#上位机项目实战——C#的dll项目编译时拷贝到指定目录下
开发语言·c#
Littlehero_1218 小时前
QT自定义控件之内嵌报表(4)(源码开源)
开发语言·qt