为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent

Why always calling mousePressEvent before mouseDoubleClickEvent

请考虑以下代码:

#include <QWidget>
#include <iostream>
#include <QApplication>

class Widget : public QWidget
{
public:
    void mousePressEvent(QMouseEvent* event)
    {
        std::cout << "mousePressEvent" < std::endl;
    }

    void mouseDoubleClickEvent(QMouseEvent* event)
    {
        std::cout << "mouseDoubleClickEvent" << std::endl;
    }
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Widget w;
    w.show();
    return app.exec();
}

每次我处理双击,输出是:

mousePressEvent
mouseDoubleClickEvent

这意味着 Qt 总是在按下一次时立即调用 mousePressEvent,而不用等待第二次按下。有没有办法关闭此选项,以便在双击时不会执行任何 mousePressEvent 调用。

如其所说 Qt DocumentationmouseDoubleClickEvent 的默认实现生成正常的鼠标按下事件。

qwidget.cpp你也可以找到评论

mouseDoubleClickEvent() is called when the user double-clicks in the widget. If the user double-clicks, the widget receives a mouse press event, a mouse release event, (a mouse click event,) a second mouse press, this event and finally a second mouse release event.

为什么不在每个事件函数中加一?如果双击,计数器将增加一倍。

更通用的解决方案:通过减去它添加的值(也可以是负数)来消除 mousePressEvent 所做的更改。

void mousePressEvent(QMouseEvent* event)
{
    counter += singleClickStep;
}

void mouseDoubleClickEvent(QMouseEvent* event)
{
    counter -= singleClickStep;
    counter += doubleClickStep;
}

singleClickStepdoubleClickStep 是您在每种情况下递增计数器的值。

Vahancho 的回答解决了无法撤消单击操作的情况,但 QApplication::doubleClickInterval() 可能太长了。另一方面,使用我的解决方案,您会看到第一次和第二次点击小部件之间的值。

我会在等于 QApplication::doubleClickInterval() 值的时间段内绕过单击事件的处理(使用 QTimer)。如果这段时间内没有发生双击,我应该处理"single click",否则应该处理双击