У меня есть приложение Qt, содержащее Qt3DWindow, а также несколько QWidgets. Чтобы использовать оба, Qt3DWindow встроен через QMainWindow::createWindowContainer()
, который отлично работает как на Windows, так и на Android. Это не относится к QObjectPicker, подключенному к QEntity, событие QObjectPicker::clicked
возникает только в Windows, а не в Android. Однако, если я удаляю Qt3DWindow из QMainWindow и снова использую его «автономно», QObjectPicker работает как положено на обеих платформах.
Я протестировал этот сценарий использования с различными версиями Qt (5.10, 5.12, 5.13 beta) и различными цепями инструментов (NDK R14 с GCC, NDK R19 с Clang) без успеха. В некоторых редких случаях я получаю событие 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».
Запущенное приложение должно отображать тор и движущуюся сферу, а при касании сферы их цвет меняется случайным образом.
Затем замените QGuiApplication app(argc, argv);
на QApplication app(argc, argv);
в main.cpp / main () и добавьте следующий код прямо перед оператором возврата:
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());
Есть идеи, что это неверная конфигурация или ошибка?