被 Qt 中的 doubleclickevent 和 mousepressevent 弄糊涂了
Posted
技术标签:
【中文标题】被 Qt 中的 doubleclickevent 和 mousepressevent 弄糊涂了【英文标题】:Confused by doubleclickevent and mousepressevent in Qt 【发布时间】:2014-10-21 13:46:28 【问题描述】:情况是:
在QGraphicsView
中,我使用它的doubleClickEvent
函数创建了一个QGraphicsItem
。
我重写了QGraphicsItem
的mousePressEvent
函数以简单地打印qDebug
信息。
然而,我发现:即使我只是双击创建那个QGraphicsItem
,新创建的QGraphicsItem
的mousePressEvent
也会被调用。
这将如何发生?我能做些什么来防止这种情况发生?
【问题讨论】:
【参考方案1】:QGraphicsView 是一个小部件,所以它有一个 doubleClickEvent。相比之下,QGraphicsItem 不是小部件,而是具有 mousePressEvent。
当你覆盖事件时,如果你不希望它们被传播到其他对象,你需要accept事件告诉系统你已经处理了它。
void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent * event)
// Create a graphics item..
...
event->accept(); // tell the system that the event has been handled
不接受事件,双击传递给QGraphicsScene,然后传递给QGraphicsItem。
如果您希望在单击场景的空白区域时能够双击创建项目,但如果您双击某个项目时让项目做出反应,则可以覆盖场景的mouseDoubleClickEvent并检查光标位置是否有项目,然后再决定是否创建项目或传递事件。
void QGraphicsScene::mouseDoubleClickEvent( QGraphicsSceneMouseEvent * mouseEvent )
if(items(mouseEvent->scenePos()).isEmpty()) // if no items are at this position
// create new graphics item
...
mouseEvent->accept(); // don't propagate the event
// no items, so allow the event to propagate by doing nothing
【讨论】:
感谢您的回答,看来我对 mousepressevent 有误解。 你不明白什么? 在Windows的情况下,触发mousepress事件的条件是什么?我正在寻找来自 qt 的文档,但很难找到... 最终,这是对来自 Windows 的鼠标按下事件的反应:msdn.microsoft.com/en-us/library/windows/desktop/…以上是关于被 Qt 中的 doubleclickevent 和 mousepressevent 弄糊涂了的主要内容,如果未能解决你的问题,请参考以下文章
被 qt 4 信号和槽中的 clicked() 和 clicked(bool) 混淆