目录

Qt绘图API

Qt:绘图API


初识绘图

我们前面学习 Qt 主要是学 Qt 的各种控件,本质上都是画出来的

都是一些常用的东西,Qt 已经提前画好了,拿过来就能使用

实际开发中,很可能现有的控件无法满足需求,就需要自己 diy 一些控件/效果

Qt 提供的 绘图 API 就是为了解决上述问题的

实际开发中大部分情况下不需要使用 绘图 API

绘图API核心类:

https://i-blog.csdnimg.cn/direct/95de120130be48038ccea4aea6038b51.png


画图相关的操作,一般不会放到 QWidget 的构造函数中调用执行,而是 Qt 提供了一个 paintEvent

事件处理函数,在这里进行调用

在出现下面的情况时,都能够自动触发到 QPaintEvent 事件:

  • 1.控件首次创建的时候

    比如往 QWidget 上画画

    QWidget 创建之前,画的东西当然不生效

    首次创建 QWidget 就能显示出画的东西来

  • 2.控件被遮挡, 再解除遮挡

    这个时机进行绘制也是很重要的,否则绘制的内容就会在被遮挡之后就没了

  • 3.窗口被最小化,再还原

  • 4.控件大小发生改变的时候

  • 5.主动在代码中调用 repaint 或者 update触发事件.(都是 QWidget 提供的成员函数)

因此 paintEvent 函数也就能够自动被调用


绘图API的使用

绘制形状(QPaintEvent)

在 widget.h 中需要重写 PaintEvent 函数:

https://i-blog.csdnimg.cn/direct/f57db853d0b645a8810e09d073b6d9e1.png

函数定义如下:

https://i-blog.csdnimg.cn/direct/5cbe0ed4d8fb4efaacff4bfcfaeddc73.png

上述函数的注意事项:

  • (void)event;是为了不报警告,因为下面的程序没有用到参数 event
  • 这是定义在栈上的变量,不需要考虑释放的问题,此处指定的 this,不是 父对象,而是指定绘制的设备(往啥东西上画)
  • drawLine后面的参数表示起点和终点的横纵坐标

此时效果为一条斜线:

https://i-blog.csdnimg.cn/direct/744730f60e204fe8855701819e236df6.png

也可以画矩形:

https://i-blog.csdnimg.cn/direct/8b5176b5cc9e4e9e9876f6c06c33dcb4.png

效果为:

https://i-blog.csdnimg.cn/direct/6d352b7201584a069260015504d4d8ae.png

也可以画圆形,前两个参数表示圆心的位置坐标,后两个参数表示圆的外接矩形的宽度和高度

正圆形:

https://i-blog.csdnimg.cn/direct/8407137245b14228854af37a9efecf24.png

椭圆形:

https://i-blog.csdnimg.cn/direct/cba899ca90bf43b1b3e2262487c48427.png

椭圆形的效果为:

https://i-blog.csdnimg.cn/direct/abf0860b7d724e0f9c30ce10d4e50d27.png


绘制文字(画笔QPen)

在上述画形状的地方改为下面的代码,就可以绘制文字了:

https://i-blog.csdnimg.cn/direct/b69b8eda4b284648b0289a5891e96c9d.png

注意理解这里的坐标的位置

此处的 0 横坐标,表示的是 文字最左侧的位置

此处的 100 纵坐标,表示的是文字的"基线位置" (整个字从上到下大约第二个三等分点的位置),也就是下图中红色线的位置:

https://i-blog.csdnimg.cn/direct/6d9524a601d14e5496930b5cd3e82b71.png

效果为:

https://i-blog.csdnimg.cn/direct/7ff946b8be3b469c8ee3ce1e5744f179.png

如果觉得字体不符合预期,也可以设置字体和字体大小:

https://i-blog.csdnimg.cn/direct/77435d51ff4d449aa4c586aa369a65d5.png

此时效果如下:

https://i-blog.csdnimg.cn/direct/61c08386e1444371a47a667f659f3ec8.png


通过画笔对象 QPen 设置绘制的形状的颜色信息:

颜色、粗细、样式

还可以设置样式:

https://i-blog.csdnimg.cn/direct/04953d13738c422ba42407690ac0faad.png

下面设置圆形的颜色、粗细、样式:

https://i-blog.csdnimg.cn/direct/f731b224012749d3a7a410d18cdc667e.png

效果为:

https://i-blog.csdnimg.cn/direct/89fa68895ccb48b8981fb134dbb588ce.png


内部填充(画刷QBrush)

画刷QBrush 主要是起到内部填充的效果

除了颜色,还有风格:

https://i-blog.csdnimg.cn/direct/15cb69e8fee040489fb1848cf65dd0b6.png

在上述画笔的代码中,添加画刷的相关代码:

https://i-blog.csdnimg.cn/direct/ea80884489804e0ca20ee74c123eb020.png

此时效果为:

https://i-blog.csdnimg.cn/direct/26d8318dd27f4f9db8c2f140269ffc20.png

上述是采用实心的方式填充的,下面采用其他方式填充:

https://i-blog.csdnimg.cn/direct/835ae1276c304ccc853a5a28881ff2c0.png

效果为:

https://i-blog.csdnimg.cn/direct/9f6a58ab63864f53a87d4b4b7ef2e63b.png

此时绿色填充中间就变为绿色的网格线了


绘制图片(QPixmap)

Qt提供了四个类来处理图像数据:Qlmage、QPixmap、QBitmap和 QPicture

它们都是常用的绘图设备

  • 其中Qlmage主要用来进行I/0 处理,它对I/0处理操作进行了优化,而且可以用来直接访问和操作像素
  • OPixmap 主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化
  • QBitmap是 QPixmap 的子类,用来处理颜色深度为1的图像,即只能显示黑白两种颜色
  • QPicture 用来记录并重演 OPainter 命令

下面以 QPixmap 为例, 只讲解 QPixmap

先创建一个项目,再创建 qrc 文件,将前面的 cat.png 导入进项目中

https://i-blog.csdnimg.cn/direct/8bb0ec94259d42dc8056212715753692.png

同样重写 paintEvent 函数:

https://i-blog.csdnimg.cn/direct/f00da29cd915429cbc26ca3f989835fc.png

效果为:

https://i-blog.csdnimg.cn/direct/61704b7afc0749438bbc58b5e8ed3c94.png

除了能进行基础的绘制,还能进行图片缩放:

https://i-blog.csdnimg.cn/direct/bda7d3f40b454fb7b3732a9b8326c95b.png

  • 100,100:指的是距离窗口左上角的偏移
  • 400,300:指的是图片缩放的长宽比例

效果为:

https://i-blog.csdnimg.cn/direct/9dae7834aa7f41b48d6d4716b80dab66.png

还可以进行图片旋转:

https://i-blog.csdnimg.cn/direct/cbd45497e3a747e69a79dfa50e01d3eb.png

  • painter.rotate(180) 是绕着 0,0 坐标系原点进行的旋转,此时旋转的效果看不到小猫图片,因为已经旋转到窗口外面了:

    https://i-blog.csdnimg.cn/direct/85816acb0c514cea93aa44945368e1d2.png

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

  • painter.translate(-800, -600) 表示将原点平移到 -800,-600 的位置

    因为原本的坐标系是向右和向下增长的, 现在旋转180度变为向左和向上增长,想让图片显示出来,就需要将图片向右和向下平移,所以x和y需要减小,也就是 -800,-600,此时效果为:

    https://i-blog.csdnimg.cn/direct/7413a391a2274c15a1decf506320c89f.png

运行程序,效果为:

https://i-blog.csdnimg.cn/direct/a484c2760f3c4008aae1101511abd401.png


Qt:绘图API到此学习结束