如果Qt3DWindow嵌入在QWidget中,为什么Qt3D QObjectPicker在Android上不起作用?

金牛座

我有一个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::MouseButtonReleaseQScreenRayCaster::trigger以事件位置作为参数调用,并通过接收了被拾取的对象,使它在Android上得以运行QScreenRayCaster::hitsChanged在Windows上,此过程也适用,但是仅当事件过滤器附加到Qt3DWindow自身而不是附加到容器窗口小部件时。我的假设是,在Windows鼠标事件将从容器小部件转发到,Qt3DWindow而在Android上,它们将由容器小部件使用。至于QObjectPicker似乎听头(只)上的事件Qt3DWindow它在Android上无法正常工作,并且没有手动将事件转发给它的选项。但这只是一个肤浅的印象,我将为进一步的澄清感到高兴。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

qt [OpenGL]在Android上不起作用

为什么getDrawable()在某些Android设备上不起作用?

为什么Filemanager在android kivymd上不起作用?

Cordova Config中的errorUrl在Android上不起作用

分页在Codeigniter 3上不起作用

jQuery在Joomla 3上不起作用

为什么多播接收在某些Android设备上不起作用?

为什么文件访问方法 getExternalStorageDirectory() 在 Android 10 (API 29) 上不起作用

setWindowFlag(Qt :: Dialog | Qt :: WindowStaysOnTopHint)在Centos上不起作用

3行,高度为100%的Flexbox布局在Android上不起作用

解析GCM推送通知在Android 6.0 Marshmallow Developer Preview 3上不起作用

Ionic3 Super Starter ngx-translation在Android Real设备上不起作用

Android中的AlarmManager仅在仿真器中起作用,而在物理设备上不起作用

Sencha Touch 2.3('setMenu')中的离画布菜单在Android 2.3上不起作用

String.getBytes()在android中某些较大的字符串上不起作用

3D转换在Firefox上不起作用(示例)

OnTriggerEnter在Unity3D上不起作用

d3 raise()在特定选择上不起作用

触摸屏在Qt Embedded上不起作用

Brew install Qt在macOS Sierra上不起作用

glViewport在Qt5.4 QOpenGLWidget :: resizeGL上不起作用

与AlphaChannel重叠的图片在QT上不起作用

Qt Creator在Ubuntu 18.04上不起作用

为什么'ipconfig'在Windows 7上不起作用

为什么SETUID在Raspberry Pi上不起作用?

为什么模糊和聚焦在Safari上不起作用?

为什么WebHook的WebApi配置在POST上不起作用?

为什么Empty()在stdClass上不起作用

为什么FieldDoesNotExist在POST.get()上不起作用?