【Qt】绘图API

基本概念

在前面学习Qt过程中的各种控件,其本质上都是画出来的,这些都是比较常用的东西,Qt已经画好了,拿过来就可以使用,但是在实际开发过程中,现有的控件可能无法满足需求,就需要自己手动diy 一些控件/效果。

Qt 提供的 绘图 API 就是为了解决上述问题。Qt 提供了画图相关的 API, 可以允许我们在窗⼝上绘制任意的图形形状, 来完成更复杂的界⾯设计。

所谓的 "控件" , 本质上也是通过画图的⽅式画上去的.
画图 API 和 控件 之间的关系, 可以类⽐成机器指令和⾼级语⾔之间的关系.
控件是对画图 API 的进⼀步封装; 画图 API 是控件的底层实现.

绘图API核心类

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

绘图 API 的使⽤, ⼀般不会在 QWidget 的构造函数中使⽤, ⽽是要放到 paintEvent 事件中

paintEvent 会在以下情况下被触发:

  • 控件⾸次创建(例如:往QWidget上画画,QWidget创建之前,画的东西不会生效,而当首次创建QWidget就能显示出画的东西来)
  • 控件被遮挡, 再解除遮挡(这个时机进行绘制也是非常重要的,否则绘制的内容就会在被遮挡之后消失)
  • 窗⼝最⼩化, 再恢复
  • 控件⼤⼩发⽣变化时
  • 主动调⽤ repaint() 或者 update() ⽅法. (这两个⽅法都是 QWidget 的⽅法)
    因此, 如果把绘图 api 放到构造函数中调⽤, 那么⼀旦出现上述的情况, 界⾯的绘制效果就⽆法确保符合预期了。

例子:绘制线段、矩形、圆形

(1)在widget.h文件中声明绘制事件

(2)实例化对象

这里定义在栈上的变量,不需要考虑释放的问题,此处的指定的this,不是父对象,而是指定绘制的设备(往什么东西上画)

(3)绘制线段

void drawLine(const QPoint &p1, const QPoint &p2);
参数:

  • p1:绘制起点坐标

  • p2:绘制终点坐标
    void drawLine ( int x1, int y1, int x2, int y2 );
    参数:

  • x1,y1:绘制起点坐标

  • x2,y2:绘制终点坐标

(4)绘制矩形

void QPainter::drawRect(int x , int y , int width , int height ) ;
参数:

  • x:窗⼝横坐标;
  • y:窗⼝纵坐标;
  • width:所绘制矩形的宽度;
  • height:所绘制矩形的⾼度

(5)绘制圆形

void QPainter::drawEllipse(const QPoint & center , int rx , int ry )
参数:

  • center:中⼼点坐标
  • rx:横坐标
  • ry:纵坐标

绘制圆形的宽度和高度是外接矩形的宽度和高度

例子:绘制文字(显示文字)

QPainter类 中不仅提供了绘制图形的功能,还可以使⽤ QPainter::drawText() 函数来绘制⽂字,也可以使⽤QPainter::setFont() 设置字体等信息。

注意理解这里的坐标位置,此处的0横坐标,表示的是文字最左侧的位置;此处的100纵坐标,表示的是文字的基线位置(baseline)。

基线:指的是拼音格中的第三根线就是基线。

例子:设置画笔

通过画笔对象QPen设置绘制的形状的颜色信息、粗细、样式。
QPainter 在绘制时,是有⼀个默认的画笔的。在使⽤时也可以⾃定义画笔。在 Qt 中,QPen类中定义了 QPainter 应该如何绘制形状、线条和轮廓。同时通过 QPen类 可以设置画笔的线宽、颜⾊、样式、画刷等。
画笔的颜⾊可以在实例化画笔对象时进⾏设置,画笔的宽度是通过 setWidth() ⽅法进⾏设置,画笔的⻛格是通过setStyle()⽅法进⾏设置,设置画刷主要是通过 setBrush() ⽅法。

  • 设置画笔颜⾊:QPen::QPen(const QColor &color) 画笔的颜⾊主要是通过 QColor 类设置;
  • 设置画笔宽度:void QPen::setWidth(int width)
  • 设置画笔⻛格:void QPen::setStyle(Qt::PenStyle style)

画笔的风格有:

(1)实例化画家

(2)设置画笔

(3)画家使用画笔

(4)执行程序

(5)全部代码

例子:设置画刷

在 Qt 中,画刷是使⽤ QBrush类 来描述,画刷⼤多⽤于填充。QBrush定义了QPainter的填充模式,具有样式、颜⾊、渐变以及纹理等属性。
画刷的格式中定义了填充的样式,使⽤ Qt::BrushStyle 枚举,默认值是 Qt::NoBrush,也就是不进⾏任何填充。可以通过 Qt 助⼿查找画刷的格式。如下图⽰:


设置画刷主要通过 void QPen::setBrush(const QBrush & brush ) ⽅法,其参数为画刷的格式。

例子:绘制图片

Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture,它们都是常⽤的绘图设备。其中QImage主要⽤来进⾏ I/O 处理,它对 I/O 处理操作进⾏了优化,⽽且可以⽤来直接访问和操作像素;QPixmap 主要⽤来在屏幕上显⽰图像,它对在屏幕上显⽰图像进⾏了优化;QBitmap是 QPixmap 的⼦类,⽤来处理颜⾊深度为1的图像,即只能显⽰⿊⽩两种颜⾊;QPicture ⽤来记录并重演 QPainter 命令。

通过QPixmap这个类,就可以表示一个图片

(1)使用qrc添加图片

(2)设置图片

(3)程序运行

例子:旋转图片

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

painter.ratate(180)是按着(0,0)坐标系原点进行的旋转。

为了让图片显示出来,可以把坐标系原点(Painter 的起点)平移一些。

关于几种图片类的介绍

在QPixmap的官方文档中:


在 Qt 中还存在下列三个⽐较特殊的绘图设备. 此处也简要介绍.

  • QPixmap ⽤于在显⽰器上显⽰图⽚.
  • QImage ⽤于对图⽚进⾏像素级修改.
  • QPicture ⽤于对 QPainter 的⼀系列操作进⾏存档.

QPixmap核⼼特性:

  • 使⽤ QPainter 直接在上⾯进⾏绘制图形.

  • 通过⽂件路径加载并显⽰图⽚.

  • 搭配 QPainter 的 drawPixmap()函数, 可以把这个图⽚绘制到⼀个 QLabel、QPushButton 等控件上.

  • 和系统/显⽰设备强相关, 不同系统/显⽰设备下, QPixmap 的显⽰可能会有所差别.
    QImage 的核⼼特性:

  • 使⽤ QPainter 直接在上⾯进⾏绘制图形.

  • 通过⽂件路径加载并显⽰图⽚.

  • 能够针对图⽚进⾏像素级别的操作(操作某个指定的像素).

  • 独⽴于硬件的绘制系统, 能够在不同系统之上提供⼀致的显⽰.
    QPicture 核⼼特性:

  • 使⽤ QPainter 直接在上⾯进⾏绘制图形.

  • 通过⽂件路径加载并显⽰图⽚.

  • 能够记录 QPainter 的操作步骤.

  • 独⽴于硬件的绘制系统, 能够在不同系统之上提供⼀致的显⽰.

【注意】QPicture 加载的必须是⾃⾝的存档⽂件, ⽽不能是任意的 png, jpg 等图⽚⽂件.

相关推荐
勤奋的小王同学~14 分钟前
怎么修改mvn的java版本
java·开发语言
594h217 分钟前
PAT 甲级 1002题
数据结构·c++·算法
doc_wei18 分钟前
Java小区物业管理系统
java·开发语言·spring boot·spring·毕业设计·课程设计·毕设
三玖诶1 小时前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式
繁依Fanyi1 小时前
828华为云征文|华为Flexus云服务器搭建OnlyOffice私有化在线办公套件
服务器·开发语言·前端·python·算法·华为·华为云
邂逅自己1 小时前
Java入门程序-HelloWorld
java·开发语言
小周的C语言学习笔记2 小时前
鹏哥C语言33---循环语句 for
c语言·c++·算法
自身就是太阳2 小时前
Maven的高级特性
java·开发语言·数据库·后端·spring·maven
hakesashou2 小时前
ruby和python哪个好学
开发语言·python·ruby
林一怂儿2 小时前
H5 three.js 实现六年级观察物体
开发语言·javascript