2016-10-18 83 views
1

我有一個QDial的子類,我想通過上下移動鼠標來更改這些值。目前,基本實現允許您用鼠標執行圓形移動以更改值。但我想改變他們移動我的鼠標要麼(讓我們說,一旦我已經按下我的撥號,我會將我的鼠標移動到我的屏幕上方)或向下(到底部屏幕)。如何讓我的QDial對不同於預定義鼠標事件的鼠標事件作出反應?

下面是一張我想要實現的圖片(提防MS Paint技能)。左邊是基本行爲,右邊是我想要的行爲。

                                                                              enter image description here

我不看我怎麼能得到與mousePressEventmouseMoveEvent。有人有想法嗎?

回答

1

除非我誤解你想,這應該是相當簡單的東西像什麼......

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,則可以使用有狀態事件過濾器實現相同的邏輯。