События нажатия клавиш в Qt 3D

Я изучаю 3D с использованием Qt и у меня возникла проблема. Я анализирую пример: https://doc.qt.io/qt-5/qt3d-basicshapes-cpp-example.html

и теперь я хотел изменить это: когда пользователь нажимает клавишу (скажем, 'w'), что-то движется (или просто отлаживает печать на этом этапе). Я пытался написать keyPressEvent функция, но я не имею никакого эффекта. Должен ли я сделать это иначе, чем в стандартном 2D-приложении?

void SceneModifier::keyPressEvent(QKeyEvent *event)
{
    switch(event->key())
    {
        case Qt::Key_W:
        {
            qDebug()<<"Key is pressed";
            break;
        }
        default:
        break;
     }
}

Ура, николай

1 ответ

Решение

SceneModifier наследуется от QObject и он не реализовал keyPressEvent метод.

keyPressEvenТ метод принадлежит окнам, в этом случае Qt3DWindowпоэтому мы создаем класс, который наследует от него, и реализуем keyPressEvent метод.

my3dwindow.h

#ifndef MY3DWINDOW_H
#define MY3DWINDOW_H

#include <Qt3DExtras/Qt3DWindow>

class My3DWindow: public Qt3DExtras::Qt3DWindow
{
    Q_OBJECT
public:
    My3DWindow(QScreen *screen = nullptr);
    ~My3DWindow();

protected:

    void keyPressEvent(QKeyEvent *ev);
};

#endif // MY3DWINDOW_H

my3dwindow.cpp

#include "my3dwindow.h"
#include <QDebug>
#include <QKeyEvent>

My3DWindow::My3DWindow(QScreen *screen):Qt3DExtras::Qt3DWindow(screen)
{

}

My3DWindow::~My3DWindow()
{

}

void My3DWindow::keyPressEvent(QKeyEvent *ev)
{
    switch (ev->key()) {
    case Qt::Key_W:
        qDebug()<<"Key is pressed";
        break;
    default:
        break;
    }
}

Изменить:

Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();

чтобы:

My3DWindow *view = new My3DWindow();

main.cpp

[...]
#include "my3dwindow.h"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    My3DWindow *view = new My3DWindow();
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f)));

 [...]

Полный код

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