持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
注:示例为Qt 5.1.1中的示例。
本文旨在学习Qt示例的源码,总结函数使用方法,学习编程思想,提高自己的编程能力。
示例运行效果:
文件目录:
具体实现:
View类:
view函数:
返回成员变量graphicsView的指针,并强制转换成基类QGraphicsView类型,用来通过指针调用基类的setScene方法。
resetView函数:
当点击重置按钮时,会触发这个函数。主要实现了恢复初始大小,恢复初始旋转角度,调用setupMatrix()函数,恢复窗口的可视范围,并且禁用重置按钮。
ensureVisible: 将窗口可视范围调整到指定位置。改变参数的值会发现,点击重置按钮后,显示的图片部分是不一样的。
setResetButtonEnabled函数:
启用重置按钮。当视图大小、旋转角度发生变化时,启用重置按钮,让用户可以点击重置按钮实现重置。当点击重置按钮后,这个按钮会禁用调,放置用户重复操作。
setupMatrix函数:
实现视图内的坐标变换,包括缩放、旋转。
qPow: 实现指数操作,第一个参数是底数,第二个参数是指数。这里实现放大倍数的计算,为2的多少次方。
QMatrix: QMatrix类提供坐标系的2D变换,可以实现显示图片过程中对图片进行缩放、旋转等一系列二维座标系统的转换动作。这里通过调用scale()来设置横纵坐标的放大倍数。通过rotate()函数设置旋转角度。graphicsView调用setMatrix()函数将变换设置进去,就实现了视图的显示变换。
通过点击上侧的Select和Drag按钮改变拖拽模式。
QGraphicsView::RubberBandDrag: 当在视口中按下并拖动鼠标时,一根橡皮筋就会出现。拖动鼠标将设置橡皮筋的几何形状,橡皮筋覆盖的所有项目都被选中。对于非交互式视图禁用此模式。
QGraphicsView::ScrollHandDrag: 光标变成指针,鼠标按下并拖动鼠标可以实现拖拽滚动效果,会引起滚动条的滚动。该模式支持交互模式和非交互模式。
setInteractive: 设置视图为交互模式/非交互模式。
toggleOpenGL函数:
创建QGLWidget为视窗或创建QWidget作为视窗。两者的绘制效果是不一样的。
toggleAntialiasing函数:
启用或禁用抗锯齿。第一个参数为渲染方式,第二个参数为启用/禁用。
print函数:
点击打印按钮时,弹出系统的打印弹框。效果如图:
render: 将视图场景渲染到打印设备中。
QPrintDialog: 提供了系统的打印弹框。
QPrinter: 是在打印机上用来完成绘制的类。
变换操作函数:
功能分别为:放大、缩小、向左旋转、向右旋转指定的数值。当点击响应的按钮或拖动滚滑块是响应这些槽函数。
MainWindow类:
MainWindow为主窗口,主要实现对窗口部件的显示和布局。这里的setupMatrix()函数没有用到。成员变量为一个视图场景QGraphicsScene和两个分离部件组成。
构造函数:
构造函数调用populateScene()函数创建所有的芯片item。
创建了两个水平QSplitter和一个垂直QSplitter。QSplitter实现了一个分离部件,允许用户通过拖动子部件之间的边界来控制它们的大小。
创建了四个View,并为四个View设置绘图场景QGraphicsScene。
对所有部件做了设置了布局。
populateScene函数:
这个函数的主要功能是为视图场景做填充。
首先创建视图场景scene,加载要显示的图片。
然后开始创建item:xx为item的水平位置,yy为item的垂直位置,nitems为item的计数。每行有22000个chip,每列有14000个chip。因为图片显示的是中心位置,所以它的实际位置为(-11000,-7000)到(11000,7000)。获取图片上像素点的颜色,创建芯片item,添加到scene中。至此,这个项目的全部功能就实现啦。
pixel: 返回给定位置像素的颜色。
一点思考:
- 这个项目可以用作Qt实现地图时的参考,因为这里包含了放大缩小、旋转、拖拽移动等功能。
- 关于图形视图的使用:首先是QGraphicsView提供一个图型视图,QGraphicsScene提供视图的场景,QGraphicsItem提供场景中的每一个item项,是图形视图中的最小单元。QMatrix实现视图的各种坐标变换。