我有一个Qt应用程序,其中包含一个Qt3DWindow以及多个QWidget。要同时使用两者,将嵌入Qt3DWindow,通过QMainWindow::createWindowContainer()
它在Windows和Android上均可正常工作。附加到QEntity的QObjectPicker并非如此,该QObjectPicker::clicked
事件仅在Windows而不是Android上引发。但是,如果我从QMainWindow中删除Qt3DWindow并再次“独立”使用它,则QObjectPicker可以在两个平台上正常工作。
我已经用不同的Qt版本(5.10、5.12、5.13 beta)和不同的工具链(使用GCC的NDK R14,使用Clang的NDK R19)测试了该用例,但没有成功。在极少数情况下,我会收到QObjectPicker :: clicked()事件,但触摸事件的发生却使该事件偏离了对象的屏幕位置。
要重现该问题,最好扩展到“ Qt 3D:简单C ++示例”。将以下包含项添加到main.cpp中:
#include <Qt3DRender/QObjectPicker>
#include <Qt3DRender/QPickEvent>
#include <QObject>
#include <QtWidgets/QApplication>
#include <QGuiApplication>
#include <QtWidgets/QMainWindow>
在return语句之前,在main.cpp / createScene()的末尾添加以下代码:
Qt3DRender::QObjectPicker* picker = new Qt3DRender::QObjectPicker();
QObject::connect(picker, &Qt3DRender::QObjectPicker::clicked, material, [material](Qt3DRender::QPickEvent *pickEvent){
qDebug() << "Sphere clicked";
static_cast<Qt3DExtras::QPhongMaterial*>(material)->setAmbient(QColor(rand()%255,rand()%255,rand()%255));
});
sphereEntity->addComponent(picker);
要为Android编译和部署,请创建一个AndroidManifest.xml并从“ android:configChanges”中删除“ density”标志。正在运行的应用应显示圆环和运动的球体,并且在触摸球体时,两者的颜色会随机变化。
接下来QGuiApplication app(argc, argv);
,QApplication app(argc, argv);
在main.cpp / main()中将替换为,并在return语句之前附加以下代码:
QMainWindow* mainWindow = new QMainWindow();
mainWindow->resize(800, 600);
auto centralwidget = new QWidget(mainWindow);
mainWindow->setCentralWidget(centralwidget);
auto container = QMainWindow::createWindowContainer(&view,mainWindow->centralWidget());
mainWindow->show();
container->resize(mainWindow->centralWidget()->size());
现在,Android应用程序在小部件内显示了相同的场景,但是触摸球体不会更改颜色。(在Windows上则相反)
注释掉最后三行可使该示例再次运行:
//auto container = QMainWindow::createWindowContainer(&view,mainWindow->centralWidget());
//mainWindow->show();
//container->resize(mainWindow->centralWidget()->size());
有任何想法是配置错误还是错误?
多亏了user3405291的提示,我终于通过在容器小部件上附加一个事件过滤器QMainWindow::createWindowContainer
,过滤出QEvent::MouseButtonRelease
,QScreenRayCaster::trigger
以事件位置作为参数调用,并通过接收了被拾取的对象,使它在Android上得以运行QScreenRayCaster::hitsChanged
。在Windows上,此过程也适用,但是仅当事件过滤器附加到Qt3DWindow
自身而不是附加到容器窗口小部件时。我的假设是,在Windows鼠标事件将从容器小部件转发到,Qt3DWindow
而在Android上,它们将由容器小部件使用。至于QObjectPicker
似乎听头(只)上的事件Qt3DWindow
它在Android上无法正常工作,并且没有手动将事件转发给它的选项。但这只是一个肤浅的印象,我将为进一步的澄清感到高兴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句