Qt示例 | 仿射变换示例 Affine Transformations(七)

95 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

注:示例为Qt 5.1.1中的示例。
本文旨在剖析Qt示例的源码,总结函数使用方法以及编程思想,提高自己的编程能力。

示例运行效果:

1.gif

文件目录:

image.png image.png

具体实现:

GLWidget类:

image.png

GLWidget类继承自QGLWidget,主要用来实现OpenGL渲染。这个类里面有两个重写的消息响应函数,paintEvent()函数用来使父窗口刷新。event()函数用来实现忽略触摸消息(当程序在支持触摸屏的硬件中运行时)。我们在定义这个类的时候,要判断我们的环境是否支持OpenGL,所以在类的开始和结尾,有#if defined(QT_OPENGL_SUPPORT)和#endif。在所有调用OPenGl相关函数和操作时,出于安全和效率考虑,都需要进行判断。

QGLWidget类是一个用于呈现OpenGL图形的小部件。QGLWidget提供了显示集成到Qt应用程序中的OpenGL图形的功能。它使用起来很简单。写一个子类继承它并像使用其他QWidget一样使用这个子类就可以了。还可以在QPainter和标准OpenGL渲染之间进行选择。从Qt 5.4开始,更喜欢使用QOpenGLWidget和QOpenGL类。

setAutoBufferSwap: 如果为true,则自动交换缓冲开关打开;否则为关闭。如果为true,并且小部件使用双缓冲格式,则在每次调用paintGL()后,后台和前台GL缓冲区将自动交换。默认情况下,缓冲区自动交换是打开的。

parentWidget: 返回这个小部件的父部件,如果没有父部件,则返回0。

QEvent::TouchBegin: 触摸屏或触控板事件序列的开始(QTouchEvent)。
QEvent::TouchUpdate: 触屏事件(QTouchEvent)。
QEvent::TouchEnd: 触摸事件序列(QTouchEvent)结束。

前置声明:

image.png

QT_FORWARD_DECLARE_CLASS()。在Qt示例中经常用到这个宏,这个宏就是C++中的前置声明。

前置声明: 就是即类、函数和模板的声明,无定义。
为什么使用前置声明: 因为前置声明可以节省编译时间。
前置声明的优点: #include 会使编译器展开对应头文件的所有内容进行编译。前置声明只需要编译你用到的部分(一般是一个指针,指向你所指的内容部分)即可。
前置声明的缺点: 当你修改了源码时,可能不重新编译你所修改的内容。

所以,我们在写一些库,或者一些大型一点的工程,基本不建议使用前置声明。如果不用前置声明的话,就需要在*.h文件里用#include添加你需要类、函数或模板头文件即可。不是很熟悉的程序猿尽可能地避免使用前置声明。使用 #include 包含需要的头文件即可。