Qt示例 | 40000 Chips(一)

552 阅读4分钟

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

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

示例运行效果:

1.gif

这个例子展示了图形视图QGraphicsView强大的导航和交互功能,可以分别缩放和旋转四个视图,并可以在场景中选择和移动项目。

文件目录:

1653442428(1).jpg

主窗体为mainwindow,主窗体中分为4个View视图,view视图中的每一个小芯片是一个chip。

具体实现:

Chip类:

image.png

在本例中,Chip类封装了一个芯片的属性和功能。

  • 属性包括芯片的颜色,芯片的行号、列号(行号和列号都是从0开始),一组点的集合(按下shift键,按下鼠标并移动,可以在芯片上画出红色的轨迹,这一组点为轨迹的点)。
  • 功能函数为重写QGraphicsItem的三个函数,其中boundingRect()函数为纯虚函数,是必须要重写的。这个纯虚函数将项的外边界定义为一个矩形;所有的绘制被限制在item的边界矩形内。QGraphicsView使用这个rect来判断item是否需要重绘。
  • boundingRect()是返回一个矩形,shap()是通过在方法中进行重写,返回一个本地坐标的QPainterPath形式的形状。该形状用于许多事情,包括碰撞检测、碰撞测试等。
  • paint()函数中完成芯片的绘制工作。在QGraphicsItem子类中重新实现此函数,通过使用painter实现绘制。option参数为item提供样式选项,例如item的状态、暴露区域和层次示意。

构造函数:

image.png

构造函数保存了chip的属性,包括芯片的行号、列号和颜色值,并且对chip item的属性做了设置,支持选中item和移动item,接受悬停事件。

setFlags: 设置item的标志,所有写在参数中的标志都设为true,没有设置的都为false。

setAcceptHoverEvents: 如果设置为true,则item将接受悬停事件;否则,item将忽略悬停事件。默认情况下,item不接受悬停事件。悬停事件通常用于突出显示鼠标进入的item,并且当鼠标悬停在item上时跟踪鼠标光标。父部件会在item之前接收鼠标进入事件,在item接收鼠标离开事件之后再接收鼠标离开事件。

boundingRect函数:

image.png

定义item的边界矩形,即需要绘制的区域,比如只需要绘制item的一部分,就可以将参数设置为(10,20,30,40),意思是绘制item的从起点(10,20),宽高为(30,40)围起来的这部分,item的其余部分不进行绘制。item的形状可以是任意的,但是边界矩形始终是个矩形,并且不受项目转换的影响。重新实现这个函数是为了让QGraphicsView确定item的哪些部分(如果有的话)需要重新绘制。

shape函数:

image.png

这里的shape定义了chip由引脚包围起来的里面的矩形框,不包括四周的引脚线。所以进行碰撞检测是,只判断chip中心部分区域,不判断引脚线部分区域。

paint函数:

image.png

绘制芯片中间矩形部分。

  • 第1部分实现填充颜色的设置,当item为选中状态时,颜色加深150,如果item在鼠标下方,颜色变浅125。
  • 第2部分实现缩放时的变化,当伸缩的倍数小于初始大小的0.125倍时,直接填充颜色。当伸缩倍数小于0.2大于0.125时,画出边框。
  • 第3部分实现选中和凹陷时的变化。
  • 第4部分实现当伸缩倍数大于等于1时,画出两条灰色的阴影线。

Q_UNUSED: 当函数参数在函数中没有用到时,编译会报警告,使用这个函数就不会报警告了。

fillRect和drawRect: fillRect用指定颜色填充矩形,drawRect绘制矩形边框。

image.png

当伸缩倍数大于等于2时,绘制出芯片上的文字。

image.png

当伸缩倍数大于等于0.5时,画出引脚线。当伸缩倍数大于等于0.4时,画出芯片上二极管的符号。

QVarLengthArray: 提供一个可变长数组。

QLineF: 提供一个浮点型的二维向量。

image.png

绘制出鼠标按下并在芯片上移动的红色轨迹。

鼠标事件函数:

image.png

接收到鼠标事件,调用update()函数刷新芯片的绘制,当鼠标移动并且按下shift按键时,绘制鼠标轨迹。

未完待续...