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

运行结果:

相关推荐
君顾17 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
香菜TTT8 小时前
大模型上下文协议(MCP):AI 应用的“USB-C”接口技术
开发语言·人工智能·经验分享
aramae8 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
Quz8 小时前
QML 常见的四种导航布局
qt
jimy19 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
ctlover9 小时前
排序与查找算法详解
开发语言·python
YYYing.9 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
江湖人称菠萝包10 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter2-GUI应用程序设计基础
笔记·qt·qt5
nvvas11 小时前
Java 入门(四):数组——数据的集合管理
java·开发语言
重生的黑客11 小时前
Qt 常用控件精讲(1):QWidget 核心属性全解 —— 从 geometry 到 qrc 与 QSS
c++·qt·qwidget·qss·常用控件