持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
注:示例为Qt 5.1.1中的示例。
本文旨在剖析Qt示例的源码,总结函数使用方法以及编程思想,提高自己的编程能力。
示例运行效果:
文件目录:
具体实现:
ArthurStyle类:
关于此类的理解:
- ArthurStyle类继承自QCommonStyle类,QCommonStyle类继承自QStyle类。
- QStyle类是一个抽象基类,它封装了GUI(图形用户界面)的外观和效果。
- Qt是一个跨平台的类库,相同的界面组件在不同的操作系统上显示效果是不一样的,比如同样是一个radiobutton,windows系统和mac系统中显示的默认效果是不同的。QT内置的界面组件都使用QStyle进行绘制,以保证他们与运行平台的界面效果一致。
- 如果我们要开发定制的小部件,并且希望它在所有平台上都看起来很好,那么就可以使用QStyle来执行小部件的部分绘图,例如drawItemText()、drawItemPixmap()、drawPrimitive()、drawControl()和drawComplexControl()。
大多数QStyle绘制函数有四个参数:
- 指定绘制哪个图形元素的枚举值;
- 指定如何以及在哪里渲染该元素的QStyleOption;
- 用于绘制该元素的QPainter;
- 执行绘图的QWidget(这个参数是可选填的);
创建自定义样式: 我们可以通过创建自定义样式为应用程序创建自定义外观。有两种创建自定义样式的方法。
- 静态方法:在静态方法中,要么选择一个现有的QStyle类,将其子类化,然后重新实现虚函数以提供自定义行为;要么从头创建整个QStyle类。
- 动态方法:在运行时修改系统样式的行为。
使用静态方法创建自定义样式:
- 第一步是选择Qt提供的样式之一,从中构建自定义样式。
- 对于QStyle类的选择将取决于哪种样式最符合你要的样式。可以用作基类的最通用的类是QCommonStyle。这是因为Qt要求它的样式为QCommonStyles。
- ArthurStyle就是使用的静态创建方法,并且子类化QCommonStyle类实现自定义样式的创建。
- 需要更改基本样式的哪些部分,就必须重新实现用于绘制这些接口部分的函数。
ArthurStyle类中只有drawHoverRect()函数是自定义函数,其余的函数均为重新实现的基类的接口函数。.cpp中有一个全局函数cached();
cached函数:
这个函数的功能是通过图片的路径创建图片的缓存并返回它的Pixmap。首先在图片缓存中查找是已经有此图片的Pixmap,如果有直接返回,如果没有,创建它的Pixmap,并加入到缓存中。
QPixmap::fromImage: 使用指定的标志来控制转换,将给定的图像转换为像素图。 QPixmapCache: 这个类是一个使用QPixmap优化绘图的工具。可以用它来存储临时的像素图,这些图的生成成本很高,而且不会比cacheLimit()使用更多的存储空间。有点向一个map,将图片的pixmap和路径一一对应存储。可以使用insert()来插入pixmaps,使用find()来查找它们,使用clear()来清空缓存。
未完待续...