找回密码
 立即注册
收起左侧

QGraphicsScene鼠标事件问题

22
回复
21532
查看
[复制链接]
累计签到:63 天
连续签到:1 天
来源: 2014-4-2 10:28:10 显示全部楼层 |阅读模式
4Qter豆
调试一个同事写的代码,在Scene中添加了Group,Group中包含了N多item这些item是动态加入到Group中的,现在想让这些Group中的item获取到鼠标事件,但是问题出现了,事件能到Group层的MousPressEvent事件函数中,再就不进入了了。在Group的鼠标事件函数中写了QGraphicsItemGroup::mousePressEvent(event);传入下层的语句,结果还是没能进入,不知道该怎么弄了,希望高手给出指点和解答。谢谢了

最佳答案

查看完整内容

我记得事件的传递是先是子对象本身,然后是父对象。你可以试试eventFilter这个函数,我之前做事件传递也遇到问题了,我觉得这个函数比较好用。
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-2 10:28:11 显示全部楼层
charles_gz 发表于 2014-4-2 17:08
同样我也尝试了在父类的事件处理器中event->ignore();还是没能进入到具体的item ...

我记得事件的传递是先是子对象本身,然后是父对象。你可以试试eventFilter这个函数,我之前做事件传递也遇到问题了,我觉得这个函数比较好用。
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-2 16:13:08 显示全部楼层
如果让事件继续传递下去,不要调用父对象的事件处理函数。用event->ignore();如果用event->accept();那么事件就不再传递了。
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-2 16:41:29 显示全部楼层
Syylc120317 发表于 2014-4-2 16:13
如果让事件继续传递下去,不要调用父对象的事件处理函数。用event->ignore();如果用event->accept();那么事 ...

我这的情况还是需要在父类中实现事件的,在父类的事件中调用QGraphicsItem:ressEvent(event);
这样是不是也应该实现把事件传下去的效果呢?
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-2 17:08:33 显示全部楼层
Syylc120317 发表于 2014-4-2 16:13
如果让事件继续传递下去,不要调用父对象的事件处理函数。用event->ignore();如果用event->accept();那么事 ...

同样我也尝试了在父类的事件处理器中event->ignore();还是没能进入到具体的item
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-2 21:28:21 显示全部楼层
Syylc120317 发表于 2014-4-2 19:53
我记得事件的传递是先是子对象本身,然后是父对象。你可以试试eventFilter这个函数,我之前做事件传递也 ...

你的意思是在子对象中实现eventfilter?然后看看是否能进入是吗?
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-2 21:41:58 显示全部楼层
Syylc120317 发表于 2014-4-2 19:53
我记得事件的传递是先是子对象本身,然后是父对象。你可以试试eventFilter这个函数,我之前做事件传递也 ...

我很怀疑我这的根本就不能进去到Item的事件中。
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-2 21:43:59 显示全部楼层
charles_gz 发表于 2014-4-2 21:41
我很怀疑我这的根本就不能进去到Item的事件中。

你可以手动让item接收事件,写一个item的public函数,传入event参数,在函数内部处理event函数。
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-2 21:45:15 显示全部楼层
charles_gz 发表于 2014-4-2 21:28
你的意思是在子对象中实现eventfilter?然后看看是否能进入是吗?

嗯,在父对象的构造函数里加上installEventFilter(item);
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-2 22:38:46 显示全部楼层
Syylc120317 发表于 2014-4-2 21:45
嗯,在父对象的构造函数里加上installEventFilter(item);

我之前只做过本类实现eventFileter 然后自己安装自己 this->installEventFilter(this);你说的在父类对象的构造函数中加上installeventFilter,我理解的是不是需要在父对象中实现eventFilter呢?还是说我在实例化item的时候就可以install呢?感谢你的耐心解答
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-3 00:16:58 显示全部楼层
Syylc120317 发表于 2014-4-2 21:45
嗯,在父对象的构造函数里加上installEventFilter(item);

我在所有Item的基类中实现了sceneEventFilter,在往Group中添加Item 的同时 installSceneEventFilter(item);
到时进入到顶层基类中了,但是异常结束了。下面是sceneEventFilter实现代码:
bool QGCompFounder::sceneEventFilter(QGraphicsItem *watched, QEvent *event)
{
    qDebug()<<"QGCompFounder::sceneEventFilter item=="<<watched
           <<" event=="<<event->type()<<"toGraphicsObject is:"<<watched->toGraphicsObject();
    return QGraphicsItem::sceneEventFilter(watched,event);
}
调试提示如“调试信息截图”。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-3 07:25:21 显示全部楼层
charles_gz 发表于 2014-4-2 22:38
我之前只做过本类实现eventFileter 然后自己安装自己 this->installEventFilter(this);你说的在父类对象 ...

这句话这么写,先重载item的eventFilter函数,然后在父对象的构造函数里添加this->installEventFilter(item)。
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-3 07:26:50 显示全部楼层
charles_gz 发表于 2014-4-3 00:16
我在所有Item的基类中实现了sceneEventFilter,在往Group中添加Item 的同时 installSceneEventFilter(ite ...

你为什么用sceneEventFilter呢,我没有用过这个函数,我只用过eventFilter函数。
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-3 09:20:53 显示全部楼层
Syylc120317 发表于 2014-4-3 07:25
这句话这么写,先重载item的eventFilter函数,然后在父对象的构造函数里添加this->installEventFilter(it ...

你说的这个父对象我应该理解为我这的Group还是所有item的共有基类呢?
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-3 13:04:14 显示全部楼层
charles_gz 发表于 2014-4-3 09:20
你说的这个父对象我应该理解为我这的Group还是所有item的共有基类呢?

父对象是指使用item的widget
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-3 14:16:08 显示全部楼层
Syylc120317 发表于 2014-4-3 13:04
父对象是指使用item的widget

我这是QML端的View-->Scene-->Group-->Item
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-3 14:34:33 显示全部楼层
charles_gz 发表于 2014-4-3 14:16
我这是QML端的View-->Scene-->Group-->Item

那在view的构造函数中。
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-3 14:51:16 显示全部楼层
Syylc120317 发表于 2014-4-3 14:34
那在view的构造函数中。

view  中是访问不到item的。
因为View是:“class QtQuick2ApplicationViewer : public QQuickView”
而Graphics的东西是在qml中通过Loader动态加载的,所以你说的在view中是无法访问到的。
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-4-3 15:43:59 显示全部楼层
charles_gz 发表于 2014-4-3 14:51
view  中是访问不到item的。
因为View是:“class QtQuick2ApplicationViewer : public QQuickView”
而G ...

嗯,widget中,我是这么做的,qml中的我不清楚,你自己想办法解决吧。
回复

使用道具 举报

累计签到:63 天
连续签到:1 天
2014-4-9 23:32:43 显示全部楼层
最终采用了把Group去掉的方法,直接把item加入到scene中的办法解决了此问题,谢谢Syylc120317的解答。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了