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

340 阅读3分钟

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

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

简单了解仿射变换

仿射变换(Affine Transformation)其实就是另外两种简单变换的叠加:一个是线性变换,一个是平移变换。
仿射变换变化包括缩放(scale)、平移(transform)、旋转(rotate)、反射(reflection,镜面效果)、剪切(shear mapping,类似于实现一个图形的影子)。

示例运行效果:

1.gif

该示例实现了使用QPainter绘制不同类型的图形,并实现图形的仿射变换。包括矢量图形、图片和文本(文本支持自定义输入)。

  • 可以拖动绘图中心的红色圆圈将其移动到一个新位置。
  • 可以拖动旁边的红色圆圈使当前绘图围绕中心圆圈旋转。也可以拖动Rotate滑块控制旋转。
  • 可以拖动Scale滑块控制缩放。
  • 可以拖动Shear滑块实现剪切变换。
  • 其他功能有:重置图形、动态展示、显示源程序、使用OpenGL绘制、说明等。

文件目录:

image.png image.png

为了提高程序的可扩展性,或者项目比较大需要多人参与项目开发时有会有很多.h和.cpp文件,管理起来比较繁琐。这时就需要用到.pri文件,将项目中某一部分功能需要的相关文件单独存放在一个文件夹中,.pri文件中保存的就是这部分中的文件目录信息。

示例中就用到了shared子项目。可以看到在项目文件目录中有一个shared文件夹,打开后可以看到里面包括一个.pri文件和其他的一些.h、.cpp和资源文件。

如何使用.pri文件:

如果想要添加一个新的子目录:

  1. 右击项目,选择添加新文件...。
  2. 选择“General”-->"Empty File",然后点击choose。
  3. 编辑名称和路径。
  4. 将新添加的文件后缀名改为.pri。
  5. 打开项目的.pro文件,将.pri文件include进来(手动写入,注意.pri文件的路径)。
  6. 重新运行项目,这时子目录的文件夹(shared)就创建出来了。
  7. 这时你可以通过选中子目录右键新建、添加,或者直接拖拽的方式将文件添加到子目录中。

如果想将一个现有的项目添加到项目中:

  1. 把现有项目放到新项目的目录中。
  2. 将现有项目的.pro文件的后缀名改为.pri。
  3. 右击新项目,选择添加现有文件,选择现有项目的.pri文件。
  4. 在新项目的.pro文件中将.pri文件include进来(手动输入)。
  5. 重新运行即可。 注: 这里要注意文件的路径问题,一个是要注意include .pri文件时的路径,一个是要注意现有项目.pri文件中的文件路径。需要在文件名前面加上"$$PWD/"表示当前路径,或者指定自定义路径。

image.png

具体实现:

main函数:

image.png

main函数主要用来创建主窗口,并为主窗口及主窗口内的所有子窗口设置GUI样式。

Q_INIT_RESOURCE: Q_INIT_RESOURCE是Qt的资源机制。
Qt资源系统是一种独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。
如果你的应用程序总是需要一组特定的文件(图标、翻译文件等),并且你不想冒丢失文件的风险,就加上这句代码,参数为资源文件名。
程序在编译时将资源存储在.cpp文件中,运行时连接它。

Qt::WA_AcceptTouchEvent: 允许小部件接收触摸事件(QTouchEvent)。必须在所有想要处理触摸事件的小部件上设置。如果没有设置此属性,来自触摸设备的事件将作为鼠标事件发送。

未完待续...