当前位置: 首页 > news >正文

qt界面优化--api绘图

文章目录

  • api绘图
    • 概念
    • 使用
      • 画直线
      • 画文字
      • 画刷
      • 画图片
    • 结语

很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!!
在这里插入图片描述
作者:٩( ‘ω’ )و260
我的专栏:qt,Linux,C++进阶,C++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!

api绘图

概念

qt中已经内置了非常多的控件,但是不能保证所有控件在任何情景下都有用,所以,有些时候,我们需要来自制控件。
api画图就是其中的一种方式。其实qt内置的控件也是通过画图api画上去的。

我们来看一下画图api的核心类:
在这里插入图片描述
QPaintDevice是QWidget的父类,QPaintDevice是画板,具有该属性才能够在其上进行画画,所以,才能够在QWidget使用控件。

核心:
当我们使用api画图对qt进行操作时,需要利用事件的机制,因为QWidget具有能够作画的能力,所以我们不需要再来创建新的类,直接在Widget类重写虚函数即可。

重写的事件为QPaintEvent,具体会触发该事件的操作如下;
1:控件首次创建的时候
2:控件被遮挡,再解除遮挡(此时画上的内容必须能够还原)
3:窗口被最小化,再恢复
4:控件大小发生改变
5:主动在代码中调用repaint或update触发事件(是QWidget提供的成员函数)

这里还有一个细节,为什么我们需要使用事件机制?因为QWidget是一个画板,但是我们如果想画画,肯定得等画板先构造出来再来话,所以肯定是不能写在Widget的构造函数中的。

使用

画直线

使用api画图来画直线。
在这里插入图片描述
来看函数定义的实现:
在这里插入图片描述
先来看结果:
在这里插入图片描述
为什么我们是在栈上创建的painter?和以前new的方式不同,在栈上创建painter同时使用this构造表示的是painter画画的对象是this,即Widget,需要话东西肯定是先要指明在哪里画吧。

上方的(void)Event作用是使用到Event变量,因为在qt中变量定义了但是不使用会报警告的。
drawLine函数需要传递两个参数,分别是QPoint,代表两个坐标,从哪里画到哪里。

我们可以使用QPen来优化一下:
在这里插入图片描述
来看结果:
在这里插入图片描述
QPen其实内置了很多的风格:
在这里插入图片描述
同时,使用api画图时画笔经常使用到的接口:
在这里插入图片描述
细节就是设置了画笔,一定需要设置画家能够使用画笔,即setPen这个接口。

还能够画圆形,画矩形,来看代码和运行结果:
在这里插入图片描述
drawEllipse函数的四个参数前两个是圆心的位置,后两个分别代表宽和高。

也能够画矩形,来看示例代码:
在这里插入图片描述
drawRect传递四个参数,前两个参数是矩形左上角的坐标,后两个参数是是矩形右下角的坐标。

画文字

使用画图api接口来绘制文字,同时,可以给文字设置字体和字号大小,来看代码:
在这里插入图片描述
来看结果:
在这里插入图片描述
参数其实也要传递QRect,可以理解为这一行字体其实也是一个矩形,同样,也需要指定矩形的左上角坐标和右下角坐标。

画刷

画刷主要是起到填充的作用的,能够设置渐变,颜色,纹理,样式等属性。先来看内置纹理的样式。
在这里插入图片描述
我们来设置一个圆形,同时给圆形给上填充。
在这里插入图片描述

画图片

同样也可以使用api画图来绘制图片,zaiqt中,提供了四个类来绘制图片。分别是QPixMap,QImage,QBitMap和QPicture。
四者的区别:
QPixMap该类型的图片用于在界面上的显示。
QImage该类型的图片主要是用于IO流,涉及网络数据传输,数据与磁盘进行交互等
QBitMap该类型继承QPixMap,可以理解为是特殊的PixMap图片,用的很少
QPicture该类型图片用于记录回放,在文件中记录的是操作。为什么要记录操作而不记录图像呢?因为如今有了60帧,120帧,直接记录图像这样数据就太大了,相反,记录操作就是字符串,空间上显示更值一些。

这里我们讲解QPixMap。
先试用qrc机制导入图片资源,再来写代码让其进行显示。
在这里插入图片描述
也是需要指定显示的位置,来进行缩放图片:
在这里插入图片描述
同样的,还可以旋转图片:
在这里插入图片描述
为什么旋转之后,右边的界面什么也没有呢?
其实,旋转的本质是将QPainter进行旋转,即此时我们旋转了180度,此时小猫跑到了第二象限(未旋转时在第四象限),因为是顺时针旋转。
在这里插入图片描述
为什么QPainter初始在第四象限,在qt前面的学习我们提到过,显示器或QWidget控件的左上角是坐标原点。

而且,旋转QPainter的时候此时坐标轴也会跟着旋转,此时坐标轴就会变成:
在这里插入图片描述
此时我们如果需要让图像显示,就需要移动坐标原点到(-800,-600)的位置,因为坐标轴旋转,移动方向就是负方向了,而且是往右下角移动,来看代码和最终结果:
在这里插入图片描述
此时旋转成功了。

结语

感谢大家阅读我的博客,不足之处欢迎指正,感谢大家支持!
路漫漫其修远兮,吾将上下而求索。
在这里插入图片描述

http://www.lryc.cn/news/618908.html

相关文章:

  • SpringBoot项目限制带参数接口配置使用数量实现
  • php+apache+nginx 更换域名
  • 力扣.870优势洗牌解决方法: 下标排序​编辑力扣.942增减字符串匹配最长回文子序列牛客.背包问题(最大体积)力扣.45跳跃游戏II 另一种思考
  • 牛客疑难题(6)
  • Transformer的编码器与解码器模块深度解析及python实现完整案例
  • 树:数据结构中的层次架构
  • 前端基础知识NodeJS系列 - 06( Node 中的 Stream 的理解?应用场景?)
  • 【154页PPT】某大型再生资源集团管控企业数字化转型SAP解决方案(附下载方式)
  • 【从零开始java学习|第三篇】变量与数据类型的关联
  • 扣子空间深度解析
  • Apache 服务器基础配置与虚拟主机部署
  • CentOS 7.9 升级 GLibc 2.34
  • (C++)继承全解析及运用
  • Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用(394)
  • 教程 | 用Parasoft SOAtest实现高效CI回归测试
  • Day02——Docker
  • 一体化步进伺服电机在无人机舱门应用中的应用案例
  • 书籍数组中未出现的最小正整数(8)0812
  • 小白挑战一周上架元服务——ArkUI04
  • Ubuntu与Rocky系统安装Java全指南
  • C# 基于halcon的视觉工作流-章29-边缘提取-亚像素
  • 深入理解数据库架构:从原理到实践的完整指南
  • 力扣47:全排列Ⅱ
  • ffmpeg,ffplay, vlc,rtsp-simple-server,推拉流命令使用方法,及测试(二)
  • Linux内核编译ARM架构 linux-6.16
  • 深度贴:前端网络基础及进阶(3)
  • archlinux中VLC无法播放视频的解决办法
  • Linux TC流控实现机制
  • MySQL——MySQL引擎层BufferPool工作过程原理
  • leetcode3258:统计满足K约束的子字符串数量Ⅰ(变长滑动窗口详解)