如何让我的QDial对不同于预定义的鼠标事件作出反应?

时间:2016-10-18 12:42:51

标签: c++ qt mouseevent qdial

我有一个QDial的子类,我想通过上下移动鼠标来更改值。目前,基本实现允许您使用鼠标进行循环移动来更改值。但我想通过移动我的鼠标来改变它们(让我们说,一旦我按下我的表盘,我会将鼠标移动到我的屏幕顶部)或者向下(到屏幕底部)。

这是我想要实现的图片(要注意,MS Paint技能未来)。在左边,这是基本行为,在右边,是我想要的行为。

enter image description here

我看不出如何通过mousePressEventmouseMoveEvent获得该功能。有人有想法吗?

1 个答案:

答案 0 :(得分:2)

除非我误解了你想要的东西,否则这应该是相当直接的... ...

class dial: public QDial {
public:
  dial (QWidget *parent = nullptr)
    : QDial(parent)
    , m_dragging(false)
    , m_scale_factor(1.0f)
    {}
protected:
  virtual void mousePressEvent (QMouseEvent *event) override
    {
      m_mouse_press_point = event->pos();
      m_dragging = true;
      m_base_value = value();
    }
  virtual void mouseReleaseEvent (QMouseEvent *event) override
    {
      m_dragging = false;
    }
  virtual void mouseMoveEvent (QMouseEvent *event) override
    {
      if (m_dragging) {
        int new_value = m_base_value + m_scale_factor * (m_mouse_press_point.y() - event->y());
        setValue(new_value);
      }
    }
private:
  bool   m_dragging;
  QPoint m_mouse_press_point;
  int    m_base_value;
  float  m_scale_factor;
};

您可能希望根据屏幕分辨率或类似情况调整m_scale_factor

如果您不想继承QDial,则可以使用有状态事件过滤器实现相同的逻辑。