【QT】绘图API

目录

绘图API核心类

第一步:重写paintEvent事件函数

第二步:创建QPainter

第三步:设置QPainter绘制的文字类型(非必须)

第四步:设置画笔属性(线条)

第五步:设置画刷的属性(填充)

第六步:开始绘制

绘制线段

绘制矩形

绘制圆形

绘制文本

绘制图片

基础绘制

缩放绘制

图片旋转

图片平移


前面介绍的Qt的各种控件,本质上都是画出来的,都是Qt已经提前画好的,拿过来就能使用,实际开发中,很可能出现现有的控件无法满足需求,需要自己diy一些控件/效果,Qt提供的绘图API就是为了解决上述问题的。

绘图API核心类

说明
QPainter "绘画者" 或者 "画家". 用来绘图的对象, 提供了⼀系列 drawXXX ⽅法, 可以允许我们绘制各种图 形.
QPaintDevice "画板". 描述了 QPainter 把图形画到哪个对象上. 像咱们之前⽤过的 QWidget 也 是⼀种 QPaintDevice (QWidget 是 QPaintDevice 的⼦类)
QPen "画笔". 描述了 QPainter 画出来的线是什么样的.
QBrush "画刷". 描述了 QPainter 填充⼀个区域是什么样的.

画图相关的操作,一般不会放到QWidget的构造函数中调用执行,而是提供了一个paintEvent事件处理函数,在这里进行调用。

第一步:重写paintEvent事件函数

在头文件中声明paintEvent函数

cpp 复制代码
void paintEvent(QPaintEvent *event);

在.cpp文件中定义该函数

cpp 复制代码
void Widget::paintEvent(QPaintEvent *event)
{
    //无实际意义,避免警告而已
    (void)event;
}

第二步:创建QPainter

cpp 复制代码
QPainter painter(this);

第三步:设置QPainter绘制的文字类型(非必须)

cpp 复制代码
QFont font("微软雅黑",24);
painter.setFont(font);

第四步:设置画笔属性(线条)

cpp 复制代码
    //设置画笔属性
    QPen pen;
    //设置成蓝色的线条
    pen.setColor(QColor(0,0,255));
    //设置线条的粗细
    pen.setWidth(5);
    //设置线条的风格
    pen.setStyle(Qt::DashLine);
    //让painter对象应用pen对象
    painter.setPen(pen);

第五步:设置画刷的属性(填充)

画刷的style取值可以如下,也就是填充效果

cpp 复制代码
//设置画刷属性
QBrush brush;
brush.setColor(QColor(0,0,255));
brush.setStyle(Qt::Dense5Pattern);
painter.setBrush(brush);

painter.drawEllipse(200,200,400,100);

如果要实现不同的填充效果,可以继续更改brush的style即可

效果如下:

第六步:开始绘制

绘制线段

void drawLine(const QPoint &p1, const QPoint &p2);
参数:
p1:绘制起点坐标
p2:绘制终点坐标

示例:

cpp 复制代码
    //创建QPainter对象
    QPainter painter(this);
    //设置QPainter绘制的字体属性
    QFont font("微软雅黑",24);
    painter.setFont(font);

    //设置画笔属性
    QPen pen;
    //设置成蓝色的线条
    pen.setColor(QColor(0,0,255));
    //设置线条的粗细
    pen.setWidth(5);
    //设置线条的风格
    pen.setStyle(Qt::SolidLine);
    //让painter对象应用pen对象
    painter.setPen(pen);

    //开始绘制
    painter.drawLine(100,100,200,100);

效果:

绘制矩形

void QPainter::drawRect(int x , int y , int width , int height ) ;
参数:
x:窗⼝横坐标;
y:窗⼝纵坐标;
width:所绘制矩形的宽度;
height:所绘制矩形的⾼度;

示例:

cpp 复制代码
    painter.drawRect(100,100,200,200);

效果:

绘制圆形

void QPainter::drawEllipse(const QPoint & center , int rx , int ry )
参数:
center:中心点坐标
rx:横坐标
ry:纵坐标

示例:

前两个参数指定圆心,后面两个参数指定外接矩形的宽度和高度

cpp 复制代码
    painter.drawEllipse(200,200,100,100);

效果

如果我们宽度或者高度不一样的话,他会产生一个椭圆的效果。

绘制文本

QPainter类 中不仅提供了绘制图形的功能,还可以使⽤ QPainter::drawText() 函数来绘制⽂字,也可以使⽤QPainter::setFont() 设置字体等信息。
这里的前两个参数,0横坐标表示的是文字最左侧的位置,100纵坐标表示的是文字的基线位置,所谓基线就是四线个中的第三条,如下:

示例:

cpp 复制代码
painter.drawText(0,100,"hello");

效果如下:

绘制图片

Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture,它们都是常⽤的绘图设备。

  • QImage主要⽤来进行 I/O 处理,它对 I/O 处理操作进⾏了优化,⽽且可以⽤来直接访问和操作像素;
  • QPixmap 主要⽤来在屏幕上显⽰图像,它对在屏幕上显⽰图像进⾏了优化;
  • QBitmap是 QPixmap 的子类,⽤来处理颜⾊深度为1的图像,即只能显示黑白两种颜⾊;
  • QPicture ⽤来记录并重演 QPainter 命令

基础绘制

前两个参数为从哪个坐标开始绘制图案

cpp 复制代码
    QPixmap pixmap(":/background.jpg");
    painter.drawPixmap(100,100,pixmap);

缩放绘制

前两个参数还是与基础绘制一样,400和300 分别是缩放后图片的宽度和高度

cpp 复制代码
    QPixmap pixmap(":/background.jpg");
    painter.drawPixmap(100,100,400,300,pixmap);

图片旋转

图片旋转,本质上是把QPainter对象进行了旋转,绘制出来的内容也就产生了旋转。

旋转180度

painter.rotate(180);

这个旋转是绕着(0,0)坐标系原点进行的旋转,因此如果我们直接旋转的话,图像可能超出窗口,无法看到效果,所以我们还要进行平移 。

图片平移

这里我们平移是把坐标系原点(painter的起点)平移一下,这里是负的是因为我们之前将整个坐标系旋转了180度所以这里要平移到窗口内,需要取负值

painter.translate(-800,-600);

相关推荐
蜀黍@猿27 分钟前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧40928 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生30 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
zh路西法38 分钟前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
大G哥40 分钟前
java提高正则处理效率
java·开发语言
VBA63371 小时前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~1 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳1 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23