【发布时间】:2019-09-04 10:11:03
【问题描述】:
我有一个 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>
在 main.cpp/createScene() 末尾的 return 语句之前添加以下代码:
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”中删除“密度”标志。 正在运行的应用程序应显示环面和移动的球体,当触摸球体时,两者的颜色会随机变化。
接下来将 main.cpp/main() 中的 QGuiApplication app(argc, argv); 替换为 QApplication app(argc, argv); 并在 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());
您知道这是配置错误还是错误?
【问题讨论】:
标签: android c++ qt qt3d qtwidgets