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

Why always calling mousePressEvent before mouseDoubleClickEvent

本文关键字:调用 mousePressEvent mouseDoubleClickEvent 为什么      更新时间:2023-10-16

请考虑以下代码:

#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调用。

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

正如它所说的Qt文档:mouseDoubleClickEvent的默认实现生成一个正常的鼠标按下事件。

qwidget.cpp中,您还可以找到注释

当用户双击小部件时,会调用mouseDoubleClickEvent((。如果用户双击,则小部件接收鼠标按下事件、鼠标释放事件、(鼠标单击事件(第二次鼠标按下、该事件以及最后的第二次小鼠释放事件。

为什么不在每个事件函数中只增加一个呢?在双击的情况下,计数器将增加两倍一。

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

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

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

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