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