qt界面优化--api绘图

文章目录

很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!!

作者:٩( 'ω' )و260

我的专栏:qtLinuxC++进阶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)的位置,因为坐标轴旋转,移动方向就是负方向了,而且是往右下角移动,来看代码和最终结果:

此时旋转成功了。

结语

感谢大家阅读我的博客,不足之处欢迎指正,感谢大家支持!

路漫漫其修远兮,吾将上下而求索。