Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Mouse Hover Problem Sporadically

Mouse Hover Problem Sporadically

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
13 Posts 3 Posters 864 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N Offline
    N Offline
    Neku
    wrote on last edited by
    #1

    constexpr int TAP_THRESHOLD_TIME = 1000; // Time(ms) diffrence b/w Operation Down and Up event

    EventHandler::EventHandler(IScreenObjectVisualProxy* pScreenObjectVisualProxy, QQuickItem* pQQuickItem)
    : m_pScreenObjectVisualProxy(pScreenObjectVisualProxy)
    , m_pItem(pQQuickItem)
    {}

    bool EventHandler::handleMousePressEvent(QPointF pos, Qt::MouseButton mouseButton)
    {
    std::shared_ptr<EventInfo> pEventInfo = nullptr;

    m_bMousePressed = true;
    m_bMouseMoveReleased = false;
    m_timerTap.start();
    // Used incase of mouseMove event, to trigger Up event when the mouse pressed is moved outside screen item boundary.
    m_mousePressedPos = pos;
    if ((mouseButton == Qt::LeftButton) && getEventInfo(EventInfo::RHEventId::Down, pos, pEventInfo, mouseButton))
    {
    
        TRACE_OUT_F(F::EVENT_HANDLER,
                    _MF("EventInfo is updated with point = %1 , point.y =%2, pEventInfo->m_nElementId = %3")
                        << pos.x() << pos.y() << pEventInfo->m_nElementId);
        m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
        TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Down"));
        return true;
    }
    else
    {
        m_timerTap.elapsed();
    }
    
    return false;
    

    }

    bool EventHandler::handleMouseMoveEvent(QPointF pos, Qt::MouseButton mouseButton)
    {
    std::shared_ptr<EventInfo> pEventInfo = nullptr;
    if (m_bMousePressed && getEventInfo(EventInfo::RHEventId::Pan, pos, pEventInfo, mouseButton))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Pan"));
    return true;
    }

    // When mouse is still pressed and moved outside screen item boundary, 'Up' event should be triggered.
    // For widget Leave event is also triggered.
    if (m_bMousePressed && !pEventInfo)
    {
        m_bMousePressed = false;
        if (getEventInfo(EventInfo::RHEventId::Up, m_mousePressedPos, pEventInfo, mouseButton))
        {
            m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
            TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Up"));
            m_bMouseMoveReleased = true;
        }
        if (getEventInfo(EventInfo::RHEventId::Leave, pos, pEventInfo, mouseButton))
        {
            m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
            TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Leave"));
        }
        return true;
    }
    return false;
    

    }

    bool EventHandler::handleMouseReleaseEvent(QPointF pos, Qt::MouseButton mouseButton)
    {
    bool bRet = false;
    std::shared_ptr<EventInfo> pEventInfo = nullptr;
    // After the right/left mouse button has been released then the system triggers "up" event.
    if (!m_bMouseMoveReleased)
    {
    if (getEventInfo(EventInfo::RHEventId::Up, pos, pEventInfo, mouseButton))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Up"));
    bRet = true;
    }
    }
    if (m_bMousePressed)
    {
    pEventInfo.reset();
    pEventInfo = nullptr;
    // IF the left left button is released within 1000 ms , tapped event will be triggered.
    // else context tapped will be triggered.
    // If the right button release is released irrespective of the time, context tapped event will be triggered.
    if ((mouseButton == Qt::LeftButton) && (m_timerTap.elapsed() < TAP_THRESHOLD_TIME) &&
    getEventInfo(EventInfo::RHEventId::Tapped, pos, pEventInfo, mouseButton))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Mouse Tapped"));
    bRet = true;
    }
    // After the right/left mouse button has been released then the system triggers "ContextTapped".
    else if ((mouseButton == Qt::RightButton || mouseButton == Qt::LeftButton) &&
    getEventInfo(EventInfo::RHEventId::ContextTapped, pos, pEventInfo, mouseButton))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Mouse Context Tapped"));
    bRet = true;
    }

        m_bMousePressed = false;
    }
    return bRet;
    

    }

    bool EventHandler::handleHoverEnterEvent(QPointF pos)
    {
    std::shared_ptr<EventInfo> pEventInfo = nullptr;
    if (getEventInfo(EventInfo::RHEventId::Enter, pos, pEventInfo))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Enter"));
    return true;
    }
    return false;
    }

    bool EventHandler::handleHoverMoveEvent(QPointF pos)
    {
    bool bRet = false;
    std::shared_ptr<EventInfo> pEventInfo = nullptr;
    if (getEventInfo(EventInfo::RHEventId::Leave, pos, pEventInfo))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Leave"));
    bRet = true;
    }
    pEventInfo.reset();
    pEventInfo = nullptr;
    if (getEventInfo(EventInfo::RHEventId::Hover, pos, pEventInfo))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Hover"));
    bRet = true;
    }
    return bRet;
    }

    bool EventHandler::handleHoverLeaveEvent(QPointF pos)
    {
    std::shared_ptr<EventInfo> pEventInfo = nullptr;
    if (getEventInfo(EventInfo::RHEventId::Leave, pos, pEventInfo))
    {
    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Leave"));
    return true;
    }
    return false;
    }

    jsulmJ 1 Reply Last reply
    0
    • N Neku

      constexpr int TAP_THRESHOLD_TIME = 1000; // Time(ms) diffrence b/w Operation Down and Up event

      EventHandler::EventHandler(IScreenObjectVisualProxy* pScreenObjectVisualProxy, QQuickItem* pQQuickItem)
      : m_pScreenObjectVisualProxy(pScreenObjectVisualProxy)
      , m_pItem(pQQuickItem)
      {}

      bool EventHandler::handleMousePressEvent(QPointF pos, Qt::MouseButton mouseButton)
      {
      std::shared_ptr<EventInfo> pEventInfo = nullptr;

      m_bMousePressed = true;
      m_bMouseMoveReleased = false;
      m_timerTap.start();
      // Used incase of mouseMove event, to trigger Up event when the mouse pressed is moved outside screen item boundary.
      m_mousePressedPos = pos;
      if ((mouseButton == Qt::LeftButton) && getEventInfo(EventInfo::RHEventId::Down, pos, pEventInfo, mouseButton))
      {
      
          TRACE_OUT_F(F::EVENT_HANDLER,
                      _MF("EventInfo is updated with point = %1 , point.y =%2, pEventInfo->m_nElementId = %3")
                          << pos.x() << pos.y() << pEventInfo->m_nElementId);
          m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
          TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Down"));
          return true;
      }
      else
      {
          m_timerTap.elapsed();
      }
      
      return false;
      

      }

      bool EventHandler::handleMouseMoveEvent(QPointF pos, Qt::MouseButton mouseButton)
      {
      std::shared_ptr<EventInfo> pEventInfo = nullptr;
      if (m_bMousePressed && getEventInfo(EventInfo::RHEventId::Pan, pos, pEventInfo, mouseButton))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Pan"));
      return true;
      }

      // When mouse is still pressed and moved outside screen item boundary, 'Up' event should be triggered.
      // For widget Leave event is also triggered.
      if (m_bMousePressed && !pEventInfo)
      {
          m_bMousePressed = false;
          if (getEventInfo(EventInfo::RHEventId::Up, m_mousePressedPos, pEventInfo, mouseButton))
          {
              m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
              TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Up"));
              m_bMouseMoveReleased = true;
          }
          if (getEventInfo(EventInfo::RHEventId::Leave, pos, pEventInfo, mouseButton))
          {
              m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
              TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Leave"));
          }
          return true;
      }
      return false;
      

      }

      bool EventHandler::handleMouseReleaseEvent(QPointF pos, Qt::MouseButton mouseButton)
      {
      bool bRet = false;
      std::shared_ptr<EventInfo> pEventInfo = nullptr;
      // After the right/left mouse button has been released then the system triggers "up" event.
      if (!m_bMouseMoveReleased)
      {
      if (getEventInfo(EventInfo::RHEventId::Up, pos, pEventInfo, mouseButton))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Up"));
      bRet = true;
      }
      }
      if (m_bMousePressed)
      {
      pEventInfo.reset();
      pEventInfo = nullptr;
      // IF the left left button is released within 1000 ms , tapped event will be triggered.
      // else context tapped will be triggered.
      // If the right button release is released irrespective of the time, context tapped event will be triggered.
      if ((mouseButton == Qt::LeftButton) && (m_timerTap.elapsed() < TAP_THRESHOLD_TIME) &&
      getEventInfo(EventInfo::RHEventId::Tapped, pos, pEventInfo, mouseButton))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Mouse Tapped"));
      bRet = true;
      }
      // After the right/left mouse button has been released then the system triggers "ContextTapped".
      else if ((mouseButton == Qt::RightButton || mouseButton == Qt::LeftButton) &&
      getEventInfo(EventInfo::RHEventId::ContextTapped, pos, pEventInfo, mouseButton))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Mouse Context Tapped"));
      bRet = true;
      }

          m_bMousePressed = false;
      }
      return bRet;
      

      }

      bool EventHandler::handleHoverEnterEvent(QPointF pos)
      {
      std::shared_ptr<EventInfo> pEventInfo = nullptr;
      if (getEventInfo(EventInfo::RHEventId::Enter, pos, pEventInfo))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Enter"));
      return true;
      }
      return false;
      }

      bool EventHandler::handleHoverMoveEvent(QPointF pos)
      {
      bool bRet = false;
      std::shared_ptr<EventInfo> pEventInfo = nullptr;
      if (getEventInfo(EventInfo::RHEventId::Leave, pos, pEventInfo))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Leave"));
      bRet = true;
      }
      pEventInfo.reset();
      pEventInfo = nullptr;
      if (getEventInfo(EventInfo::RHEventId::Hover, pos, pEventInfo))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Hover"));
      bRet = true;
      }
      return bRet;
      }

      bool EventHandler::handleHoverLeaveEvent(QPointF pos)
      {
      std::shared_ptr<EventInfo> pEventInfo = nullptr;
      if (getEventInfo(EventInfo::RHEventId::Leave, pos, pEventInfo))
      {
      m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
      TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Leave"));
      return true;
      }
      return false;
      }

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @Neku Please tell us what problem you have, not just posting big amount of code without saying what actually does not work...

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • N Offline
        N Offline
        Neku
        wrote on last edited by
        #3

        Sometimes After Pressing Mouse Button it doesn't released Button doesn't come back to its original color same thing happening with mouse hover also

        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Hi,

          That does not help much more.

          You need to provide a clear explanation about what you do, what is happening and what you expect.

          Also, reduce your code to the bare minimal so you can provide a minimal compilable example.

          Also, post your code between coding tags, that will make it readable unlike the first post in this thread (you can edit it to fix it).

          About that code, beside some Qt types here and there, it looks like you either are using some native functionality or some other framework. That's the kind of stuff that you should explain.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • N Offline
            N Offline
            Neku
            wrote on last edited by
            #5

            I have different tabs button when I press on them or hover on them it is not getting released sometime.

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #6

              As already requested, provide a minimal compilable example that shows your issue.

              Nobody can help you with the small amount of information you gave.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • N Offline
                N Offline
                Neku
                wrote on last edited by
                #7

                code for mousepress
                bool EventHandler::handleMousePressEvent(QPointF pos, Qt::MouseButton mouseButton)
                {
                std::shared_ptr<EventInfo> pEventInfo = nullptr;

                m_bMousePressed = true;
                m_bMouseMoveReleased = false;
                m_timerTap.start();
                // Used incase of mouseMove event, to trigger Up event when the mouse pressed is moved outside screen item boundary.
                m_mousePressedPos = pos;
                if (getEventInfo(EventInfo::RHEventId::Down, pos, pEventInfo, mouseButton))
                {
                
                    TRACE_OUT_F(F::EVENT_HANDLER,
                                _MF("EventInfo is updated with point = %1 , point.y =%2, pEventInfo->m_nElementId = %3")
                                    << pos.x() << pos.y() << pEventInfo->m_nElementId);
                    m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
                    TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Down"));
                    return true;
                }
                
                return false;
                

                }

                1 Reply Last reply
                0
                • N Offline
                  N Offline
                  Neku
                  wrote on last edited by
                  #8

                  code for mouse release
                  bool EventHandler::handleMouseReleaseEvent(QPointF pos, Qt::MouseButton mouseButton)
                  {
                  bool bRet = false;
                  std::shared_ptr<EventInfo> pEventInfo = nullptr;
                  // After the right/left mouse button has been released then the system triggers "up" event.
                  if (!m_bMouseMoveReleased)
                  {
                  if (getEventInfo(EventInfo::RHEventId::Up, pos, pEventInfo, mouseButton))
                  {
                  m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
                  TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Up"));
                  m_bMousePressed = false;
                  m_bMouseMoveReleased = true;
                  m_timerTap.elapsed();
                  bRet = true;
                  }
                  }
                  else if (m_bMousePressed)
                  {
                  pEventInfo.reset();
                  pEventInfo = nullptr;
                  // IF the left left button is released within 1000 ms , tapped event will be triggered.
                  // else context tapped will be triggered.
                  // If the right button release is released irrespective of the time, context tapped event will be triggered.
                  if ((mouseButton == Qt::LeftButton) && (m_timerTap.elapsed() < TAP_THRESHOLD_TIME) &&
                  getEventInfo(EventInfo::RHEventId::Tapped, pos, pEventInfo, mouseButton))
                  {
                  m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
                  TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Mouse Tapped"));
                  bRet = true;
                  }
                  // After the right/left mouse button has been released then the system triggers "ContextTapped".
                  else if ((mouseButton == Qt::RightButton || mouseButton == Qt::LeftButton) &&
                  getEventInfo(EventInfo::RHEventId::ContextTapped, pos, pEventInfo, mouseButton))
                  {
                  m_pScreenObjectVisualProxy->onTriggerMouseEvent(pEventInfo);
                  TRACE_OUT_F(F::EVENT_HANDLER, _M("Event Triggered: Mouse Context Tapped"));
                  bRet = true;
                  }

                      m_bMousePressed = false;
                  }
                  return bRet;
                  

                  }

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    Can you please provide what was requested and not some snippet of code from your application ?

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • N Offline
                      N Offline
                      Neku
                      wrote on last edited by
                      #10

                      Problem is after pressing Mouse Button on a Button sometimes it is not releasing it should released

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        Do you realize that we are running in circles ?

                        I have already asked you several time to provide a minimal compilable example that shows your issue.

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        0
                        • N Offline
                          N Offline
                          Neku
                          wrote on last edited by
                          #12

                          void DFQuickItem::hoverEnterEvent(QHoverEvent* pEvent)
                          {
                          if ((pEvent == nullptr) || (nullptr == m_pEventHandler))
                          {
                          TRACE_OUT_F(F::INFO, _M("pEvent or m_pEventHandler is nullptr "));
                          return;
                          }

                          if (!m_pEventHandler->handleHoverEnterEvent(pEvent->pos()))
                          {
                          
                              TRACE_OUT_F(F::INFO, _M("hoverEnter Event is not present for Rete element "
                                                      "at position x: %1 y: %2")
                                                       << pEvent->pos().x() << pEvent->pos().y());
                          }
                          

                          }

                          jsulmJ 1 Reply Last reply
                          0
                          • N Neku

                            void DFQuickItem::hoverEnterEvent(QHoverEvent* pEvent)
                            {
                            if ((pEvent == nullptr) || (nullptr == m_pEventHandler))
                            {
                            TRACE_OUT_F(F::INFO, _M("pEvent or m_pEventHandler is nullptr "));
                            return;
                            }

                            if (!m_pEventHandler->handleHoverEnterEvent(pEvent->pos()))
                            {
                            
                                TRACE_OUT_F(F::INFO, _M("hoverEnter Event is not present for Rete element "
                                                        "at position x: %1 y: %2")
                                                         << pEvent->pos().x() << pEvent->pos().y());
                            }
                            

                            }

                            jsulmJ Offline
                            jsulmJ Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #13

                            @Neku https://en.wikipedia.org/wiki/Minimal_reproducible_example

                            https://forum.qt.io/topic/113070/qt-code-of-conduct

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved