Qt:只有没有拖放时才接受mouseRelease

时间:2015-11-15 04:47:56

标签: c++ qt

我有一个QGraphicsView的子类,应该接受两种鼠标事件:拖放滚动和简单点击项目选择/突出显示。 所以我用

setDragMode(QGraphicsView::ScrollHandDrag);

启用使用" Hand"滚动视图。我有这样的功能:

void GraphView::mouseReleaseEvent(QMouseEvent* e)
{
    if (e->button() == Qt::LeftButton)
        emit leftClicked(mapToScene(e->pos()));
    else
        emit rightClicked(mapToScene(e->pos()));
    QGraphicsView::mouseReleaseEvent(e);
}

只要用户点击场景就会创建信号。

然而,问题是:当我停止拖动并释放鼠标按钮时,会调用mouseReleaseEvent函数,如果光标恰好位于场景的某个元素上,它将突出显示。 如何更改mouseReleaseEvent功能,以便仅在以前没有拖动鼠标时才创建信号?

1 个答案:

答案 0 :(得分:1)

如果将mousePress和mouseMove与mouseRelease结合使用,则可以确定用户刚刚执行的鼠标操作。

如果你有mousePress然后是mouseRelease,那么它必须是一个简单的点击。 如果你有mousePress,mouseMove,然后是mouseRelease,那么它必须是一个拖动。

Qt文档包含在涂鸦程序中解释鼠标事件组合的示例。 http://doc.qt.io/qt-4.8/qt-widgets-scribble-example.html

您可以将原则扩展为以下内容:

private bool MyWidget::dragging = false;
private bool MyWidget::pressed = false;


void MyWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        pressed=true;
    }
    QGraphicsView::mousePressEvent(event)
}

void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
    if ((event->buttons() & Qt::LeftButton) && pressed)
    {
        dragging=true;
    }
    QGraphicsView::mouseMoveEvent(event)
}

void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && pressed) {
        pressed = false;
        if (dragging)
        {
            dragging = false;
        }
        else
        {
            // plain mouse click
            // do something here
        }
    }
    QGraphicsView::mouseReleaseEvent(event)
}

请注意,这并不能解决仅在窗口小部件内部执行用户鼠标操作的边缘情况。我还必须承认我对Qt相对较新,并且还没有使用过ScrollHandDrag,但这就是人们如何识别鼠标事件的特定组合。