Qt3D 输入处理系统的工作方式因创建位置而异

Qt3D input handling system works differently depending on the place it was created

我正在为 Qt3DRender::QCamera 实现一个自定义相机控制器,我遇到了 Qt3DInput::QMouseHandler 的一个相当奇怪的行为。根据创建它的环境,它要么响应鼠标事件,要么不响应。有两种情况:在 MainWindow object 中同时创建设备和处理程序,或者在我的相机控制器 class 中创建它们(它只适用于第一种情况)。

第一种情况:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    auto* window = new Qt3DExtras::Qt3DWindow();

    auto* window_container = QWidget::createWindowContainer(window, this, Qt::Widget);
    setCentralWidget(window_container);

    auto* scene = new Qt3DCore::QEntity();
    window->setRootEntity(scene);

    auto* mouse_device = new Qt3DInput::QMouseDevice(scene);
    auto* mouse_handler = new Qt3DInput::QMouseHandler(scene);
    mouse_handler->setSourceDevice(mouse_device);

    connect(mouse_handler, &Qt3DInput::QMouseHandler::positionChanged,
        [](Qt3DInput::QMouseEvent* event)
        {
            qDebug() << "I am actually printing to console!!!";
        });
}

第二种情况:

class CustomCameraController final : public Qt3DCore::QNode
{
Q_OBJECT

public:
    explicit CustomCameraController(Qt3DCore::QNode* parent = nullptr)
      : Qt3DCore::QNode(parent),
        mouse_device(new Qt3DInput::QMouseDevice(this)),
        mouse_handler(new Qt3DInput::QMouseHandler(this))
    {
        mouse_handler->setSourceDevice(mouse_device);

        connect(mouse_handler, &Qt3DInput::QMouseHandler::pressAndHold, this,
          &CustomCameraController::MousePositionChanged);
    }

public slots:
    void MousePositionChanged(Qt3DInput::QMouseEvent* event)
    {
        qDebug() << "I am not printing anything...";
    }

protected:
    Qt3DInput::QMouseDevice* mouse_device;
    Qt3DInput::QMouseHandler* mouse_handler;
};


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    auto* window = new Qt3DExtras::Qt3DWindow();

    auto* window_container = QWidget::createWindowContainer(window, this, Qt::Widget);
    setCentralWidget(window_container);

    auto* scene = new Qt3DCore::QEntity();
    window->setRootEntity(scene);

    auto* controller = new CustomCameraController(scene);
}

删除了所有不必要的代码。 main.cpp 文件由 Qt Framework 自动生成

我搜索了整个 Qt 文档,但在这种情况下找不到任何帮助我的东西。我还注意到,如果设备和处理程序在构造函数中使用 parent 作为参数进行初始化,则它无济于事。此外,我尝试在 MainWindow 范围内创建设备和处理程序,并通过一些 setter 函数将它们传递给控制器​​,但它也无济于事。

所以我想问的问题是:Qt3DInput::QMouseDeviceQt3DInput::QMouseHandler的正确使用方法是什么?是否有更好的解决方法来为我的自定义相机控制器实现输入处理?

更新 1:

您应该将控制器 class 声明添加到 header 而不是主 window 源文件。以下是您将需要的所有包含和 qmake 选项:

#include <Qt3DCore/QNode>
#include <Qt3DInput/QMouseDevice>
#include <Qt3DInput/QMouseHandler>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DCore/QEntity>

3dinput 3dcore 3dextras

看起来你刚刚连接到不同的信号。
在第一种情况下,您使用的是 &Qt3DInput::QMouseHandler::positionChanged ,它会经常发送。在第二个中 - &Qt3DInput::QMouseHandler::pressAndHold 将在按下并按住鼠标按钮时发送。
修复后调用两个日志记录函数。