QGraphicsScene和QGrphicsItem右键菜单问题

Sword-Master 2012-03-28 03:03:58
我的Scene里面有几个自己的Item....
右键点击Scene和Item出不同的菜单....
我目前Scene的菜单总是覆盖item的...
就是说只能有一个存在...
怎么让我在点Item的时候出它的菜单
点Item以外的地方出Scene的菜单呢?
郁闷啊 求大神帮助....要用事件过滤器吗?
急....
...全文
1086 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sword-Master 2012-03-29
  • 打赏
  • 举报
回复
那Item的contextMenuEvent函数不是要写成public的了?
因为这个判断是在Scene里的..
还有您写的 判断完以后else里面怎么写= =
我自己写的是这样的 但还是不管用 求指点~~

QGraphicsItem* selectedItem = itemAt( event->scenePos());

if ( !selectedItem)
{
QMenu mymenu;
mymenu.addAction(newItem);
mymenu.exec(QCursor::pos());
QGraphicsScene::contextMenuEvent( event );
return;
}else
{
BX_NEItem *pWireItem = (BX_NEItem *)selectedItem;//强制转换为我的Item类型
if( pWireItem !=NULL )
{
pWireItem->contextMenuEvent( event );
}
}

[Quote=引用 2 楼 的回复:]
是scene先接到事件。

可以在scene的contextMenuEvent中,对当前是否选中了item进行判断。

例如:


C/C++ code

if (itemAt(contextMenuEvent->scenePos()))
{
QGraphicsScene::contextMenuEvent(contextMenuEvent);
}


如果当……
[/Quote]
bestman 2012-03-29
  • 打赏
  • 举报
回复
恩,谢啦!
xiachm 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

但是我的item是可移动的,可缩放的,这样也支持么?
[/Quote]
没问题,这个方法是基于itemAt拾取的,是由scene来完全控制。从设计上说,这种方法更加紧凑,可以在一个地方对菜单进行集中控制。

另外多说两句,QGraphicsScene的contextMenuEvent和QGraphicsItem的contextMenuEvent,看起来有点重复,但仔细分析,后者还是有用的,很显然它非常适合组件开发。
bestman 2012-03-29
  • 打赏
  • 举报
回复
但是我的item是可移动的,可缩放的,这样也支持么?
Sword-Master 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
首先,我们覆盖了QGraphicsScene::contextMenuEvent方法,这直接导致了事件的响应流程被我们打断了,因为系统调用的不是QGraphicsScene的contextMenuEvent,而是我们自己写的这个派生类的contextMenuEvent方法,而在else里调用QGraphicsScene::contextMenuEvent就是为了将被打断的流程接起来。

只要把……
[/Quote]

嗯!了解了! 谢谢大神!~
xiachm 2012-03-29
  • 打赏
  • 举报
回复
首先,我们覆盖了QGraphicsScene::contextMenuEvent方法,这直接导致了事件的响应流程被我们打断了,因为系统调用的不是QGraphicsScene的contextMenuEvent,而是我们自己写的这个派生类的contextMenuEvent方法,而在else里调用QGraphicsScene::contextMenuEvent就是为了将被打断的流程接起来。

只要把控制权交还给QGraphicsScene的contextMenuEvent,Item的contextMenuEvent()函数就将自动被调用。我们不需要管。
Sword-Master 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 10 楼 的回复:

那Item的contextMenuEvent函数不是要写成public的了?
因为这个判断是在Scene里的..
还有您写的 判断完以后else里面怎么写= =
我自己写的是这样的 但还是不管用 求指点~~
C/C++ code

QGraphicsItem* selectedItem = itemAt( event->scenePos());

i……
[/Quote]
哦 用你的方法可以了....
但是else里面用的是QGraphicsScene::contextMenuEvent(event);
为什么出来的是Item的右键菜单...比较费解额= =
虽然Scene和Item的contextMenuEvent函数的参数类型是一样的..
按照那个事件传导 else里面也应该是用Item的contextMenuEvent()函数,就如我自己写的..
但QGraphicsScene::也行.....这是怎样一种情况额..糊涂了都..
xiachm 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

那Item的contextMenuEvent函数不是要写成public的了?
因为这个判断是在Scene里的..
还有您写的 判断完以后else里面怎么写= =
我自己写的是这样的 但还是不管用 求指点~~
C/C++ code

QGraphicsItem* selectedItem = itemAt( event->scenePos());

if ( !selectedIte……
[/Quote]
QGraphicsScene的文档中,在contextMenuEvent部分有提到:
The default implementation forwards the event to the topmost item that accepts context menu events at the position of the event. If no items accept context menu events at this position, the event is ignored.

也就是说,这个事件会传导下去,不用你自己调用。

你的代码可以改成:


QGraphicsItem *selectedItem = itemAt(contextMenuEvent->scenePos());

if (!selectedItem)
{
QMenu mymenu;
mymenu.addAction("newItem");
mymenu.exec(QCursor::pos());
}
else
{
QGraphicsScene::contextMenuEvent(contextMenuEvent);
}
xiachm 2012-03-28
  • 打赏
  • 举报
回复
其实这个问题,我建议就不要为Item设置菜单了,直接在scene的contextMenuEvent中通过itemAt(contextMenuEvent->scenePos())拾取当前选中的元素,根据类型弹出不同的菜单就得了。
bestman 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
你那个问题不是解决了吗?
[/Quote]
放一边搁着呢,能在scene中显示出来,item就显示不了右键菜单
xiachm 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

我的item右键显示不出来,郁闷啊~~~
[/Quote]
你那个问题不是解决了吗?
bestman 2012-03-28
  • 打赏
  • 举报
回复
我的item右键显示不出来,郁闷啊~~~
xiachm 2012-03-28
  • 打赏
  • 举报
回复
是scene先接到事件。

可以在scene的contextMenuEvent中,对当前是否选中了item进行判断。

例如:


if (itemAt(contextMenuEvent->scenePos()))
{
QGraphicsScene::contextMenuEvent(contextMenuEvent);
}

如果当前鼠标位置下有item,则向下传导事件。
wk5882846 2012-03-28
  • 打赏
  • 举报
回复
item接收鼠标事件的顺序应该在scene的前面才对,要是你item没用的话,可能是你item的右键菜单没写好。
你可以试试把你的scene的菜单代码注释了,然后再点item,估计也没有反应吧。

16,202

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧