为什么总是在mouseDoubleClickEvent

时间:2015-05-15 14:58:02

标签: c++ qt events double-click mousepress

请考虑以下代码:

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

正如Qt Documentation所述:mouseDoubleClickEvent的默认实现会生成正常的鼠标按下事件。

qwidget.cpp中,您还可以找到评论

  

当用户双击窗口小部件时,将调用mouseDoubleClickEvent()。如果用户双击,则窗口小部件接收鼠标按下事件,鼠标释放事件(鼠标单击事件),第二次鼠标按下,此事件以及最后第二次鼠标释放事件。

答案 2 :(得分:0)

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

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

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

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

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

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