2024年3月13日发(作者:)
Qt GraphicsView框架中实现多个item之间的层次调整功能
目的:要实现GraphicsView中多个item之间的层次调整功能,即:选中的item可
以实现"移动至顶层、移动至底层、上移一层、下移一层"等功能。 之前盲目地认
为Qt API会提供“获取与之相邻的sibling item”类似这样的接口,但是查询无果。。。
setZValue()设置item的栈顺序,通过zValue()来测试,具有低z-values的item比具有
高z-value的item先绘制。(即:低z-values的item位于下层,高z-values的item位
于上层) 可以调用setZvalue()来设置一个item的Z值。默认的Z值是0,具有
同样的Z值的item会按照插入的顺序来入栈(stack order)。也就是说,GraphicsView会
优先根据item的Z值决定item的层次,只有当Z值相同的情况下才会去理会stack order;
这样,我就基本上决定放弃采用setZvalue()方法来实现我的功能了,因为,由于所有item
的Z值默认都是0,调用setZvalue()方法基本上只能实现置于顶层或底层的功能,即使想
办法获取到了与其相邻的上一个或下一个item,也是需要去设置相关item的Z值,这样
一来,维护tiem的层次的工作完全由自己来完成了,而不再是GraphicsSene自己去根据
stack
order去管理维护了,自己的工作量会很大,而且,效率会比较低下。。。于是,果断
放弃此途径。 还是想偷个赖,把item的维护工作依然交给Scene,所以通过调
整item的stack order来实现上述功能。 API有一个stackBefore(QGraphicsItem
*sibling) 方法,可以调用该访求来重新排序item的列表,就可以直接调整item的顺序
了。例如:itemA->stackBefore(itemB),是将itemA的order重置到itemB之前,
这样,先绘制itemA,后绘制itemB,itemB处于上方。但是,这需要我解决“获取sibling
item”的工作,还好问题不大,QGraphicsScene类方法collidingItems(QGraphicsItem
*item)会返回一个在这个Scene中与传入的item有碰撞的所有其它item的一个列表
QList<QGraphicsItem
*>,注意一下,这个列表是不包含item本身的,而且以是自上层向下层的顺序来
返回的。 于是,自己写了一个算法,以获取当前item在所有冲撞items中的位
置,如下所示: [cpp:nogutter] view
plaincopyint QDrawGraphicsScene::getItemIndex(QGraphicsItem *item)
{
//list1是与item碰撞的其它item列表
QList<QGraphicsItem *> list1 = collidingItems(item);
//没有碰撞
if (() == 0)
return 0;
//只有一个与之碰撞
if (() == 1) //共2层
{
QRectF
rect1(item->mapToScene(item->boundingRect()).boundingRect());


发布评论