Как отловить событие mousePressEvent на Esri :: ArcGISRuntime :: Graphic?

158
03 февраля 2020, 07:00

Все события мыши protected. Я пытался сделать это через eventFilter и используя QObject :: connect, но результат ложный. Как мне поймать событие щелчка на Esri :: ArcGISRuntime :: Graphic ?

Что я пробовал:

...
    void ViewshedGeoElement::graphic3dMouseClicked()
    {
        qDebug()<<"m_graphic3d";
    }
    bool ViewshedGeoElement::eventFilter(QObject *obj, QEvent *event)
    {
        qDebug()<<obj<<event;
        if (event->type() == QEvent::MouseButtonPress)
        {
            graphic3dMouseClicked();
            return true;
        }
        return false;
    }
...
Esri::ArcGISRuntime::Graphic* m_graphic3d = nullptr;
m_model3d = new ModelSceneSymbol(QUrl(dataPath + PathModel), 1.0f, this);
m_model3d->setAnchorPosition(SceneSymbolAnchorPosition::Bottom);
m_model3d->setHeading(180.0f);
m_graphic3d = new Graphic(dp.m_pos, m_model3d, this);
m_graphic3d->attributes()->insertAttribute(HEADING, dp.m_heading);
m_graphic3d->attributes()->insertAttribute(PITCH, dp.m_pitch);
m_graphic3d->attributes()->insertAttribute(ROLL, dp.m_roll);
m_sceneView->graphicsOverlays()->at(0)->graphics()->installEventFilter(m_graphic3d);
...

Второй способ тоже не позволяет отловить событие:

...
void ViewshedGeoElement::graphic3dMouseClicked()
{
    qDebug()<<"m_graphic3d";
}
...
QObject::connect(m_graphic3d,SIGNAL(mousePressEvent()),this,SLOT(graphic3dMouseClicked()));
Answer 1

Мой код выбирает один Graphic и выделяет его:

...
    QObjectList m_PointLogLag;
...
    void ViewshedGeoElement::connectSignals()
    {
        // handle the identifyLayerCompleted signal
        QObject::connect(m_sceneView, &SceneQuickView::identifyGraphicsOverlayCompleted, this, [this](QUuid, IdentifyGraphicsOverlayResult* result)
        {
            if (result->graphicsOverlay()->graphics()->isEmpty())
                return;
            // get the results
            GraphicListModel* graphicElements = result->graphicsOverlay()->graphics();
            for(int i=0;i<graphicElements->size();i++)
            {
                Point loaction = graphicElements->at(i)->geometry();
                qDebug()<<floor(loaction.x()*10000 )/10000<<floor(m_PointLogLag.last()->property("latitude").toDouble()*10000 )/10000;
                qDebug()<<floor(loaction.y()*10000 )/10000<<floor(m_PointLogLag.last()->property("longitude").toDouble()*10000 )/10000;
                if (floor(loaction.x()*10000 )/10000==floor(m_PointLogLag.last()->property("latitude").toDouble()*10000 )/10000,
                    floor(loaction.y()*10000 )/10000==floor(m_PointLogLag.last()->property("longitude").toDouble()*10000 )/10000)
                {
                   graphicElements->at(i)->setSelected(true);
                   return;
                }
            }
        });
        //     when the scene is clicked, identify the clicked feature and select it
        QObject::connect(m_sceneView, &SceneQuickView::mousePressed, this, [this](QMouseEvent& mouseEvent)
        {
            //     clear any previous selection
            m_sceneView->graphicsOverlays()->at(0)->clearSelection();
            Point clickedPoint = m_sceneView->screenToBaseSurface(mouseEvent.x(), mouseEvent.y());
            m_PointLogLag.append(new Coordinates(clickedPoint.x(),clickedPoint.y()));
            //     identify from the click
            m_sceneView->identifyGraphicsOverlay(m_sceneView->graphicsOverlays()->at(0), mouseEvent.x(), mouseEvent.y(), 10, false);
        });
    }
READ ALSO
No matching function for call to &#39;Random&#39;

No matching function for call to 'Random'

Почему не компилируется я же всё вроде бы (но это не точно) грамотно написал

146
C++ как правильно использовать template&lt;typename T&gt;?

C++ как правильно использовать template<typename T>?

Пытаюсь сделать функцию, которая будет возвращать тип из шаблона, что-то вроде такого:

168
Адресная математика: на что влияет тип указателя?

Адресная математика: на что влияет тип указателя?

Я всегда думал, что для адресной математики не важно, какого типа указатель - все равно вычисления будет производить в байтахНо, кажется, я упустил...

170
Qt предупреждения

Qt предупреждения

Вроде после первичного использования setRootIndex на директорию у QAbstractItemView для модели QFileSystemModel в терминал сыпятся ошибки:

144