• 16591阅读
  • 6回复

QGraphicsScene 内的鼠标事件问题 [复制链接]

上一主题 下一主题
离线wisconxing
 
只看楼主 倒序阅读 楼主  发表于: 2009-04-24
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
我的程序中有一QGraphicsScene 实体scene,并为它设置了3个鼠标事件
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent);
用于用鼠标在scene内画图形。

在scene内用addItem()加入一个QGraphicsItem的实体item,也为item设置了3个鼠标事件
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent);
用于用鼠标移动在Item内显示的字符。

  但运行时,无论鼠标在scene内还是在Item内,都只是在scene内画图形,如何是鼠标事件不被scene捕获,而被item捕获呢? 谢谢。

离线sbtree
只看该作者 1楼 发表于: 2009-04-24
解决这个问题的一个比较简单的方法是设定一个状态变量,用来标识鼠标操作的对象,在鼠标事件函数中判断该状态变量,如果是对scene中的item对象进行操作,就直接调用相应的QGraphicsScene的鼠标事件函数,否则执行你想做的代码。
更改状态变量变量的方法目前我想到两种:
1。在主界面上设定不同的互斥按钮,当按钮变化时,更改状态变量的值
2。另一种方法是直接在鼠标移动的过程中或者按下时设定,取得当前鼠标位置,利用itemAt()获取该点的item,如果返回0表示对scene操作,否则对item操作。
windows 7 + VC++2008 + Qt4.5.2
离线wisconxing
只看该作者 2楼 发表于: 2009-05-04
谢谢 sbtree,我先试试。
离线wisconxing
只看该作者 3楼 发表于: 2009-05-04
我在程序中增加了一对单选钮控制变量v,并确定变量v=0时用鼠标在scene内画图,v=1时用鼠标移动在Item内显示的字符。
在Scene的mouse*Event()中加入 if (v!=0) return; 在Item的mouse*Event()中加入 if (v!=1) return;
但结果只能使程序不处理鼠标在scene中的事件,并不能使图元Item的鼠标事件获得响应。我觉得应该有一种在这两套鼠标事件之上的机制,决定谁对鼠标事件做出响应。
离线sbtree
只看该作者 4楼 发表于: 2009-05-04
引用第3楼wisconxing于2009-05-04 14:32发表的  :
我在程序中增加了一对单选钮控制变量v,并确定变量v=0时用鼠标在scene内画图,v=1时用鼠标移动在Item内显示的字符。
在Scene的mouse*Event()中加入 if (v!=0) return; 在Item的mouse*Event()中加入 if (v!=1) return;
但结果只能使程序不处理鼠标在scene中的事件,并不能使图元Item的鼠标事件获得响应。我觉得应该有一种在这两套鼠标事件之上的机制,决定谁对鼠标事件做出响应。

更改一下你的代码试一试,在Scene的mouse*Event()中改成 if (v!=0) return mouse*Event();
scene实际上是个容器类,调用默认的鼠标函数才能将事件传递给它内部的item
windows 7 + VC++2008 + Qt4.5.2
离线wisconxing
只看该作者 5楼 发表于: 2009-05-05
非常感谢sbtree,问题已解决。
离线5373119

只看该作者 6楼 发表于: 2011-12-23
快速回复
限100 字节
 
上一个 下一个