关键词不能为空

当前您在: 主页 > 英语 >

qtgraphicsview框架中实现多个item之间的层次调整功能

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-13 19:42
tags:

-

2021年2月13日发(作者:bomb)


Qt GraphicsView


框架中实现多个


item


之间的层次调整功能








目的:要实现


GraphicsView


中 多个


item


之间的层次调


整功能,即 :选中的


item


可以实现


< p>
移动至顶层、移动至底


层、


上移一层、

< p>
下移一层



等功能。










之前盲目地认为


Qt API


会提供“获取与之相邻的


sibling item”类 似这样的接口,


但是查询无果。



。< /p>










setZValue()


设置


item


的栈顺序,


通过


zValue()


来测试,具有低


z-values


< p>
item


比具有高


z-value



item


先绘制。



即:



z-values


item


位于下层,



z-values



item

< br>位于上层)










可以调用


setZvalue()< /p>


来设置一个


item


< br>Z


值。默认的


Z


值是

< p>
0


,具有同样的


Z


值的< /p>


item


会按照插入的顺序来入栈


(st ack order)



也就是说,


G raphicsView


会优先根据


item

< br>的


Z


值决定


item

< p>
的层次,



有当


Z


值相同的情况下才会去理会


stack order

< br>;


这样,


我就


基本上决定放弃采 用


setZvalue()


方法来实现我的功能了,

< p>


为,由于所有


item



Z


值默认都是


0

,调用


setZvalue()



法基本上只能实现置于顶层或底层的功能,即使想办法获取


到了与其相邻的上一个或下一 个


item



也是需要去设置相关


item



Z


值, 这样一来,维护


tiem


的层次的工作完全由自


己来完成了,而不再是


GraphicsSene


自己 去根据


stack



order


去管理维护了,自己的工作量会很大,而且,效率会


比较低下。



。于是,果断放弃此途径。










还是想 偷个


赖,



item

< br>的维护工作依然交给


Scene



所以通过调整


item



stack order


来实现上述功能。









API


有一个


stackBefore(QGraphicsItem *sibling)


方法 ,可以调用该访


求来重新排序


item


的列表,


就可以直接调整


item


的顺 序了。


例如:


itemA->stackBefore( itemB)


,是将


itemA



order


重置到


itemB


之前,


这样,


先绘制


ite mA



后绘制


itemB



itemB


处于上方。但是,这需要我解决“获取


sibling item”的工作,


还好问题不大,


QGraphicsScene


类方法


coll idingItems(QGraphicsItem *item)


会返回一个在这个


Scene


中与传入的


item


有碰撞的所有其它


item


的一个列表


QList<QGraphicsItem



*>


,注意一下,这个列表是不包含


item< /p>


本身的,而且以


是自上层向下层的顺序来返回的。










于是,自己写了


一个算法,


以获取当前


item


在所有冲撞


items

< p>
中的位置,



下所示:



[cpp:nogutter] view



plaincopyint


QDrawGraphicsSc ene::getItemIndex(QGraphicsItem


*item)




{








//list1


是与


item


碰撞的其它


item


列表









QList<QGraphicsItem *> list1 =


collidingItems(item);









//


没有碰撞









if (() == 0)












return 0;









//


只有一个与之碰撞









if (() == 1)






















//



2










{












QRectF

< br>rect1(item->mapToScene(item->boundingRect ()).bou


ndingRect());












QRectF


rect2(()- >mapToScene(()->bounding


Rect()).b oundingRect());












QRectF rectMix = ected(rect2);












QPointF


point(item->mapFromScene(rectMix).boundingR ect().ce


nter());












QRectF rect(point.x()-0.5, point.y()-0.5, 1, 1);












if (item->isObscured(rect))
















return 1;

































//i tem


为下层(共


2


层)




-


-


-


-


-


-


-


-



本文更新与2021-02-13 19:42,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/652343.html

qtgraphicsview框架中实现多个item之间的层次调整功能的相关文章

qtgraphicsview框架中实现多个item之间的层次调整功能随机文章