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

156 阅读3分钟

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

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

示例运行效果:

1.gif

文件目录:

image.png image.png

具体实现:

ArthurStyle类:

image.png

关于此类的理解:

  • ArthurStyle类继承自QCommonStyle类,QCommonStyle类继承自QStyle类。
  • QStyle类是一个抽象基类,它封装了GUI(图形用户界面)的外观和效果。
  • Qt是一个跨平台的类库,相同的界面组件在不同的操作系统上显示效果是不一样的,比如同样是一个radiobutton,windows系统和mac系统中显示的默认效果是不同的。QT内置的界面组件都使用QStyle进行绘制,以保证他们与运行平台的界面效果一致。
  • 如果我们要开发定制的小部件,并且希望它在所有平台上都看起来很好,那么就可以使用QStyle来执行小部件的部分绘图,例如drawItemText()、drawItemPixmap()、drawPrimitive()、drawControl()和drawComplexControl()。

大多数QStyle绘制函数有四个参数:

  1. 指定绘制哪个图形元素的枚举值;
  2. 指定如何以及在哪里渲染该元素的QStyleOption;
  3. 用于绘制该元素的QPainter;
  4. 执行绘图的QWidget(这个参数是可选填的);

创建自定义样式: 我们可以通过创建自定义样式为应用程序创建自定义外观。有两种创建自定义样式的方法。

  • 静态方法:在静态方法中,要么选择一个现有的QStyle类,将其子类化,然后重新实现虚函数以提供自定义行为;要么从头创建整个QStyle类。
  • 动态方法:在运行时修改系统样式的行为。

使用静态方法创建自定义样式:

  • 第一步是选择Qt提供的样式之一,从中构建自定义样式。
  • 对于QStyle类的选择将取决于哪种样式最符合你要的样式。可以用作基类的最通用的类是QCommonStyle。这是因为Qt要求它的样式为QCommonStyles。
  • ArthurStyle就是使用的静态创建方法,并且子类化QCommonStyle类实现自定义样式的创建。
  • 需要更改基本样式的哪些部分,就必须重新实现用于绘制这些接口部分的函数。

ArthurStyle类中只有drawHoverRect()函数是自定义函数,其余的函数均为重新实现的基类的接口函数。.cpp中有一个全局函数cached();

cached函数: image.png

这个函数的功能是通过图片的路径创建图片的缓存并返回它的Pixmap。首先在图片缓存中查找是已经有此图片的Pixmap,如果有直接返回,如果没有,创建它的Pixmap,并加入到缓存中。

QPixmap::fromImage: 使用指定的标志来控制转换,将给定的图像转换为像素图。 QPixmapCache: 这个类是一个使用QPixmap优化绘图的工具。可以用它来存储临时的像素图,这些图的生成成本很高,而且不会比cacheLimit()使用更多的存储空间。有点向一个map,将图片的pixmap和路径一一对应存储。可以使用insert()来插入pixmaps,使用find()来查找它们,使用clear()来清空缓存。

未完待续...