Управление мышью над 3D-окном Qt

У меня есть QWidget, содержащий Qt3DWindow(). Я хотел бы иметь возможность "увеличивать" и уменьшать масштаб QtEntity внутри Qt3DWindow, используя колесо прокрутки мыши при наведении курсора на окно.

У меня работает функционал, но только при наведении мышки за пределы рамки Qt3DWindow. Вот мой код для инициализации окна и обработки событий колесика мыши.

Инициализация окна:

mainView = new Qt3DExtras::Qt3DWindow();
mainView->defaultFramegraph()->setClearColor(QColor(QRgb(0x4d4d4f)));

QWidget *container = QWidget::createWindowContainer(mainView);

Обработка событий колеса:

void ModelView::wheelEvent(QWheelEvent *event){

    QVector3D vec;

    vec = cameraEntity->position() - modifier->m_transform->translation();

    vec = vec.normalized();

    QPoint delta = event->angleDelta();

    int zoom_distance = delta.y()*0.01;

    vec = cameraEntity->position() - zoom_distance*vec;

    cameraEntity->setPosition(vec);
}

В чем заключается хитрость переопределения захвата мыши в окне при наведении курсора на рамку Qt3DWindow?

Заранее благодарю за любую помощь.

1 ответ

Решение

Я бы рекомендовал использовать фильтр событий для перехвата событий Qt3DWindow. Ваш класс ModelView может установить себя как фильтр событий в Qt3DWindow, обнаруживать события колеса, обрабатывать их сам и возвращать true, чтобы указать, что они обработаны. Для всех других событий верните false, и Qt3DWindow получит и обработает их в обычном режиме.

Посмотрите методы QObject::installEventfilter и QObject::eventFilter в документации.

Другие вопросы по тегам