簡體   English   中英

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

[英]Why does the Qt3D QObjectPicker not work on Android if the Qt3DWindow is embedded inside a QWidget?

我有一個Qt應用程序,其中包含一個Qt3DWindow以及多個QWidget。 要同時使用兩者,Qt3DWindow是通過QMainWindow::createWindowContainer()嵌入的,在Windows和Android上都可以正常工作。 附加到QEntity的QObjectPicker::clicked如此, QObjectPicker::clicked事件僅在Windows而非Android上QObjectPicker::clicked 但是,如果我從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”中刪除“ 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的提示,我終於在Android上通過將事件過濾器附加到QMainWindow::createWindowContainer返回的容器小部件,濾除QEvent::MouseButtonRelease ,以事件位置作為參數調用QScreenRayCaster::trigger並接收了通過QScreenRayCaster::hitsChanged拾取對象。 在Windows上,此過程也適用,但是僅當事件過濾器附加到Qt3DWindow本身而不是容器窗口小部件Qt3DWindow 我的假設是,在Windows上,鼠標事件從容器小部件轉發到Qt3DWindow而在Android上,它們是由容器小部件消耗的。 至於QObjectPicker似乎聽頭(只)上的事件Qt3DWindow它不會在Android上正常工作,沒有選擇手動將事件轉發到它。 但這只是一個膚淺的印象,我將為進一步的澄清感到高興。

對象選擇器僅在單擊鼠標時起作用。 如果你需要觸摸手勢,你需要使用QScreenRayCaster作為解釋這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM