【问题标题】:Why always calling mousePressEvent before mouseDoubleClickEvent为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent
【发布时间】:2015-05-16 04:54:39
【问题描述】:

请考虑以下代码:

#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 如何预测您是否也会总是点击第二次?你想解决什么样的问题?
  • 我有某种计数器,如果双击,我必须将其增加 2,如果单击一次,则增加 1。在这种情况下,我找到了一种解决方法,并且每次都将其递增一次。
  • 正如我之前在一篇评论中提到的,我按照你的说法做了。我只是想避免调用 mousePress。如果mu程序在单击的情况下执行一次登录,而在双击的情况下执行相反的登录,那会怎样。在这种情况下,两个函数都被调用..

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    qwidget.cpp你也可以找到评论

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 为什么不 counter += singleClickStep();在这两种情况下?
      • @Eduard Rostomyan 这(也)适用于你提到的情况,你增加/减少,所以singleClickStep返回1,doubleClickStep返回-1。
      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 2018-03-27
      相关资源
      最近更新 更多