请考虑以下代码:
#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调用。
答案 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;
}
singleClickStep
和doubleClickStep
是在每种情况下递增计数器的值。
Vahancho的回答解决了无法撤消单击所做内容的情况,但QApplication::doubleClickInterval()
可能太长了。另一方面,通过我的解决方案,您已经可以看到小部件上第一次和第二次点击之间的值。