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

运行结果:

相关推荐
2601_9628857210 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen10 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发10 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
WL学习笔记11 小时前
日期类(C++)
开发语言·c++·日期类实现
谢亮_vipxieliang12 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛12 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
xxwl58512 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
code2cat15 小时前
Java进阶篇之AtomicMarkableReference:引用还在,标记已经改变
java·开发语言·cas·并发编程·逻辑删除
CappuccinoRose16 小时前
FormData数据处理
开发语言·前端·javascript·表单数据
Zguigo16 小时前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++