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::QMouseDevice
和Qt3DInput::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
将在按下并按住鼠标按钮时发送。
修复后调用两个日志记录函数。
我正在为 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::QMouseDevice
和Qt3DInput::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
将在按下并按住鼠标按钮时发送。
修复后调用两个日志记录函数。