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)的位置,因为坐标轴旋转,移动方向就是负方向了,而且是往右下角移动,来看代码和最终结果:
此时旋转成功了。
结语
感谢大家阅读我的博客,不足之处欢迎指正,感谢大家支持!
路漫漫其修远兮,吾将上下而求索。