【问题标题】:Qt how to check which mouse button is pressedQt如何检查按下了哪个鼠标按钮
【发布时间】:2013-05-21 12:08:02
【问题描述】:

在尝试确定在事件函数中按下了哪个鼠标按钮时,我在 PySide 中遇到了问题。我特别需要它来忽略鼠标移动事件,因为它在左右鼠标按钮上都起作用。

如果按下场景上的右键,我想忽略鼠标移动事件。有什么帮助吗?

【问题讨论】:

    标签: c++ qt pyqt pyside


    【解决方案1】:

    所有鼠标事件都有两种方法(buttonbuttons)来确定哪个按钮被按下。但仅对于 move 事件,文档说:

    请注意,鼠标移动事件的返回值始终是 Qt::NoButton。

    对于mouseMoveEvent,你应该使用buttons 方法。

    void mouseMoveEvent(QMouseEvent *e)
    {
        if(e->buttons() == Qt::RightButton)
            qDebug() << "Only right button";
    }
    

    为了忽略移动事件,您当然需要在eventFilter 中完成这项工作。

    【讨论】:

    • 这就是我需要的。太感谢了。如果您可以帮助我进行鼠标过滤,我会为 eventFilter 提出新问题。
    • @Alex 不客气,我会尽快看到你关于eventFilter 的问题,但我只能为你提供 C++ 代码。
    【解决方案2】:

    QApplication::mouseButtons() 将返回mouseButton 的状态, 所以,你可以在KeyPressEvent中获取鼠标的状态。

    【讨论】:

      【解决方案3】:

      您可以通过Qt::RightButton 查看按下了哪个鼠标按钮。对不起 c++ 代码,但我希望你能理解这个想法:

      void mousePressEvent(QMouseEvent *event)
      { 
          if (event->button()==Qt::RightButton){
              qDebug() << "right button is pressed
          }
      }
      

      【讨论】:

      • 投票支持你的参与,但我已经尝试过了,虽然它适用于鼠标按下和释放鼠标,但它不适用于 MOUSE MOVE 事件。
      • 这对我不起作用。无论我做什么,小部件都会收到QContextMenuEvent 而不是QMouseEvent - 即使我没有菜单,并且尝试使用setContextMenuPolicy 也不会改变任何事情。
      • 您必须在 mouseMoveEvents 上使用 .buttons()(注意“s”),因为 .button() 将始终为该事件返回 Qt::NoButton。 doc.qt.io/qt-5/qmouseevent.html#button
      【解决方案4】:

      您可以使用布尔值:

      void mousePressEvent(QMouseEvent *event)
      { 
      if (event->button()==Qt::RightButton){
          qDebug() << "right button is pressed
          pressed=true; //<-----
      }
      }
      

      在 mouseMoveEvent 上

      void GLWidget::mouseMoveEvent(QMouseEvent *event)
      {
      
      float dx = event->x() - lastPos.x();      // where lastpos is a QPoint member
      float dy = event->y() - lastPos.y();
      
      if (dx<0) dx=-dx;
      if (dy<0) dy=-dy;
      
      if (event->buttons() & Qt::LeftButton) {  //if you have MOVEd
      
           ...do something
      
      }
      
      if (event->buttons() & Qt::RightButton) {
      
          if (pressed==true) return;  
          else{
          ...do   
          } 
      }
      }
      

      在鼠标释放时你必须设置pressed=false; (“pressed”必须是该类的成员)

      希望对你有帮助,告诉我

      【讨论】:

      • +1 试试,但这不是我需要的。我不会为此设置布尔值,当用户使用鼠标笨拙时风险太大......已经注意到 Qt 在鼠标事件处理方面并不是最好的。我确信有用于此目的的内置方法。
      • 这似乎不能正常工作,它似乎只拾取鼠标按钮,如果语句读取:例如if (event-&gt;buttons() == Qt::LeftButton),而不是button()
      猜你喜欢
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多