3

a のサブクラスがありQDial、マウスを上下に動かして値を変更したいと考えています。現時点では、基本的な実装では、マウスで円を描くように動かして値を変更できます。しかし、マウスを上に動かして変更したいと思います(ダイヤルを押したら、マウスを画面の一番上に移動するとします)または下に移動します(画面の一番下まで)。

これが私が達成したいことの写真です(注意してください、MSペイントのスキルが先にあります)。左側が基本的な動作で、右側が希望する動作です。

                                        ここに画像の説明を入力

mousePressEventまたはでそれを取得する方法がわかりませんmouseMoveEvent。誰かアイデアがありますか?

4

1 に答える 1

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、ステートフル イベント フィルターを使用して同じロジックを実装できます。

于 2016-10-18T13:15:33.623 に答える