为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent
Why always calling mousePressEvent before mouseDoubleClickEvent
请考虑以下代码:
#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 Documentation:mouseDoubleClickEvent
的默认实现生成正常的鼠标按下事件。
在qwidget.cpp
你也可以找到评论
mouseDoubleClickEvent() is called when the user double-clicks in the widget. If the user double-clicks, the widget receives a mouse press event, a mouse release event, (a mouse click event,) a second mouse press, this event and finally a second mouse release event.
为什么不在每个事件函数中加一?如果双击,计数器将增加一倍。
更通用的解决方案:通过减去它添加的值(也可以是负数)来消除 mousePressEvent
所做的更改。
void mousePressEvent(QMouseEvent* event)
{
counter += singleClickStep;
}
void mouseDoubleClickEvent(QMouseEvent* event)
{
counter -= singleClickStep;
counter += doubleClickStep;
}
singleClickStep
和 doubleClickStep
是您在每种情况下递增计数器的值。
Vahancho 的回答解决了无法撤消单击操作的情况,但 QApplication::doubleClickInterval()
可能太长了。另一方面,使用我的解决方案,您会看到第一次和第二次点击小部件之间的值。
我会在等于 QApplication::doubleClickInterval()
值的时间段内绕过单击事件的处理(使用 QTimer
)。如果这段时间内没有发生双击,我应该处理"single click",否则应该处理双击
请考虑以下代码:
#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 Documentation:mouseDoubleClickEvent
的默认实现生成正常的鼠标按下事件。
在qwidget.cpp
你也可以找到评论
mouseDoubleClickEvent() is called when the user double-clicks in the widget. If the user double-clicks, the widget receives a mouse press event, a mouse release event, (a mouse click event,) a second mouse press, this event and finally a second mouse release event.
为什么不在每个事件函数中加一?如果双击,计数器将增加一倍。
更通用的解决方案:通过减去它添加的值(也可以是负数)来消除 mousePressEvent
所做的更改。
void mousePressEvent(QMouseEvent* event)
{
counter += singleClickStep;
}
void mouseDoubleClickEvent(QMouseEvent* event)
{
counter -= singleClickStep;
counter += doubleClickStep;
}
singleClickStep
和 doubleClickStep
是您在每种情况下递增计数器的值。
Vahancho 的回答解决了无法撤消单击操作的情况,但 QApplication::doubleClickInterval()
可能太长了。另一方面,使用我的解决方案,您会看到第一次和第二次点击小部件之间的值。
我会在等于 QApplication::doubleClickInterval()
值的时间段内绕过单击事件的处理(使用 QTimer
)。如果这段时间内没有发生双击,我应该处理"single click",否则应该处理双击