Как я могу заставить мой QDial реагировать на событие мыши, отличное от предопределенного?

У меня есть подкласс QDial и я хочу изменить значения, перемещая мою мышь вверх и вниз. На данный момент базовая реализация позволяет сделать круговое движение с помощью мыши, чтобы изменить значения. Но я хотел бы изменить их двигая мою мышь либо вверх (допустим, что когда я нажму на циферблат, я подведу мышь к верхней части экрана) или вниз (внизу экрана).

Вот картина (будьте осторожны, навыки MS Paint впереди) того, чего я хочу достичь. Слева, это основное поведение, а справа, поведение, которое я хотел бы иметь.

                                        введите описание изображения здесь

Я не понимаю, как я мог получить это с mousePressEvent или же mouseMoveEvent, У кого-нибудь есть идея?

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 та же логика может быть реализована с помощью фильтра событий с отслеживанием состояния.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]