持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
注:示例为Qt 5.1.1中的示例。
本文旨在剖析Qt示例的源码,总结函数使用方法以及编程思想,提高自己的编程能力。
示例运行效果:
文件目录:
具体实现:
XFormView类:
setRotation函数:
设置旋转角度。首先保存当前旋转角度,然后更新新的旋转角度。
现调用translate函数将坐标原点挪动到中心点的位置,然后调用rotate函数完成旋转,然后在恢复坐标原点位置。最后将控制点全部乘以新的坐标系。
QMatrix: 表示矩阵,指定坐标系的2D转换。指定如何平移、缩放、剪切或旋转坐标系,通常在渲染图形时使用。QMatrix对象可以使用setMatrix()、scale()、rotate()、translate()和shear()函数来。也可以使用reset()函数将其重置。
它可以进行乘法运算,采用的是矩阵运算。
QPolygonF: 可以看做是一个存放浮点型Point的vector。
timerEvent函数:
timerEvent是定时器的响应函数,这里主要通过定时器实现动态效果。在成员变量中定义了一个QBasicTimer类型的定时器,当按下Animation按钮时打开定时器,抬起按钮时关闭定时器。
每次响应,缩放、角度、形态都会发生变化,通过发送信号改变滑块位置实现。
QBasicTimer: 为对象提供计时器事件。这是Qt内部使用的一个快速、轻量级和低级的类。
使用方法:
创建一个QBasicTimer,指定一个超时间隔和一个指向QObject子类的指针。
调用start()函数开始计时。
timerEvent()为超时响应事件。
调用stop()停止计时器。
isActive()返回计时器是否正在运行。
可以使用timerId()获取计时器的ID。
如果在应用程序中使用计时器,建议使用更高级别的QTimer类,而不是这个类。注意,这个计时器是一个重复的计时器,除非调用stop()函数,否则它将发送后续的计时器事件。
setUpdatesEnabled: 设置部件是否启用更新。
一个支持更新的小部件会接收paint事件并具有系统背景;禁用的小部件则不会。这也意味着,如果更新被禁用,调用update()和repaint()将不起作用。\
setUpdatesEnabled()通常用于在短时间内禁用更新,例如避免在较大更改期间屏幕闪烁。在Qt中,小部件通常不会产生屏幕闪烁,但在X11中,当小部件被隐藏时,服务器可能会在它们被替换之前清除屏幕上的区域。
使用方法:
setUpdatesEnabled(false);
bigVisualChanges();
setUpdatesEnabled(true);
一点想法:
- 对于图形变换要熟悉使用坐标系、点等类的用法。