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

4

3 回答 3

3

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

于 2015-05-15T15:12:57.163 回答
0

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

qwidget.cpp您还可以找到评论

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

于 2015-05-15T15:06:43.373 回答
0

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

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

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

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

singleClickStep并且doubleClickStep是您在每种情况下增加计数器的值。

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

于 2015-05-15T15:11:27.173 回答