被 Qt 中的 doubleclickevent 和 mousepressevent 弄糊涂了

Posted

技术标签:

【中文标题】被 Qt 中的 doubleclickevent 和 mousepressevent 弄糊涂了【英文标题】:Confused by doubleclickevent and mousepressevent in Qt 【发布时间】:2014-10-21 13:46:28 【问题描述】:

情况是:

QGraphicsView 中,我使用它的doubleClickEvent 函数创建了一个QGraphicsItem。 我重写了QGraphicsItemmousePressEvent 函数以简单地打印qDebug 信息。

然而,我发现:即使我只是双击创建那个QGraphicsItem,新创建的QGraphicsItemmousePressEvent也会被调用。

这将如何发生?我能做些什么来防止这种情况发生?

【问题讨论】:

【参考方案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) 混淆

在ARM中,当Qt程序中的文本被鼠标选中的时候,Qt就会死掉,高手指点。

第39课 Qt中的事件处理(下)

Qt 插槽未被调用

Qt--Qt中的事件处理

初探Qt中的消息处理