为什么鼠标双击事件前总是先调用鼠标单击事件?

4
请考虑以下代码:
#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如何预测你是否总是会第二次点击呢?你试图解决什么样的问题? - vahancho
我有一种计数器,如果双击,则必须将其增加2,如果单击则增加1。在这种情况下,我找到了一个解决方法,每次递增一次。 - Eduard Rostomyan
正如我之前在评论中提到的,我按照您所说的做了。我只是试图避免调用mousePress。如果我的程序在单击时执行一个登录操作,在双击时执行相反的登录操作,那么这两个函数都会被调用。 - Eduard Rostomyan
3个回答

4

我建议通过 QTimer 来跳过单击事件的处理,时间间隔为 QApplication::doubleClickInterval() 的值。如果在这段时间内没有发生双击,则应该处理 "单击" 事件,否则应该处理双击事件。


0

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

qwidget.cpp中,你还可以找到以下注释:

当用户双击小部件时,将调用mouseDoubleClickEvent()。如果用户双击,小部件将接收一个鼠标按下事件、一个鼠标释放事件(一个鼠标点击事件)、第二个鼠标按下事件、这个事件和最后一个鼠标释放事件。


0
为什么不在每个事件函数中递增一次呢?如果是双击事件,计数器会递增两次。
更加通用的解决方案是:通过减去mousePressEvent所添加的值(也可以为负值)来消除其造成的变化。
void mousePressEvent(QMouseEvent* event)
{
    counter += singleClickStep;
}

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

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

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


为什么不在两种情况下都使用 counter += singleClickStep(); 呢? - Eduard Rostomyan
@Eduard Rostomyan 这也适用于你提到的情况,其中你进行增量/减量,因此 singleClickStep 返回 1,而 doubleClickStep 返回 -1。 - LogicStuff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接