Qt QWheelEvent angleDelta не меняется - PullRequest
0 голосов
/ 14 мая 2019

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

Я отлаживаю печать колеса angleDelta, и это какое-то постоянное, огромное число. Я не смог найти никого в Интернете, у которого была такая же проблема.

bool MyClass::eventFilter(QObject *obj, QEvent *event)
{
    QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
    switch (static_cast<int>(event->type()))
    {
    case QEvent::GraphicsSceneWheel:
    {
        if (QApplication::keyboardModifiers() & Qt::ControlModifier)
        {
            const QGraphicsView::ViewportAnchor anchor = view->transformationAnchor();
            view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
            int angle = wheel_event->angleDelta().y();
            qreal factor;

            qDebug() << "Ctrl + Wheel Event! Angle = " << angle << wheel_event->angleDelta().y() << wheel_event->pixelDelta().y() << wheel_event->delta() << wheel_event->angleDelta();

            if (angle > 0)
            {
                factor = 1.1;
            } else
            {
                factor = 0.9;
            }
            view->scale(factor, factor);
            view->setTransformationAnchor(anchor);
            break;
        }
    }
    }
}

Я ожидаю увидеть отрицательные числа при прокрутке вниз, но все значения, которые я печатаю, никогда не меняются, независимо от направления прокрутки. В этом коде view является указателем на объект QGraphicsView.

1 Ответ

3 голосов
/ 14 мая 2019

Если event->type() == QEvent::GraphicsSceneWheel, то фактический тип события равен QGraphicsSceneWheelEvent , а не QWheelEvent. Таким образом, ваш код, как показано, имеет неопределенное поведение. Попробуйте (не проверено) ...

bool MyClass::eventFilter (QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::GraphicsSceneWheel) {
        if (auto *wheel_event = static_cast<QGraphicsSceneWheelEvent*>(event)) {
            if (QApplication::keyboardModifiers() & Qt::ControlModifier) {
                const QGraphicsView::ViewportAnchor anchor = view->transformationAnchor();
                view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
                qreal factor;

                qDebug() << "Ctrl + Wheel Event! Delta = " << wheel_event->delta();

                if (wheel_event->delta() > 0) {
                    factor = 1.1;
                } else {
                    factor = 0.9;
                }
                view->scale(factor, factor);
                view->setTransformationAnchor(anchor);
            }
        }
    }

    /*
     * The following assumes `QObject` is the base class of MyClass.
     */
    return QObject::eventFilter(obj, event);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...