Skip To Content ArcGIS for Developers Sign In Dashboard

ArcGIS Runtime SDK for Qt

Show a popup

Sample Viewer View Sample on GitHub

Show predefined popups from a web map.

Use case

Many web maps contain predefined popups which are used to display the attributes associated with each feature layer in the map, such as hiking trails, land values, or unemployment rates. You can display text, attachments, images, charts, and web links. Rather than creating new popups to display information, you can easily access and display the predefined popups.

How to use the sample

Tap on the features to prompt a popup that displays information about the feature.

How it works

  1. Create and load a Map using a URL.
  2. Set the map to a MapView and connect to the MapView.mouseClicked signal.
  3. Use GeoView.identifyLayer(layer, x, y, tolerance, allowPopupsOnly) to identify the top-most feature.
  4. Create a PopupManager for each of the result's Popups and append them to a list.
  5. Assign the list of popup managers to the PopupStackView.popupManagers property.
  6. Display the popup stack view.

Relevant API

  • IdentifyLayerResult
  • Map
  • PopupManager
  • PopupStackView

About the data

This sample uses a feature layer that displays reported incidents in San Francisco.

Tags

feature, feature layer, popup, web map

Sample Code

import QtQuick 2.6
import QtQuick.Controls 2.2
import Esri.ArcGISRuntime 100.9
import Esri.ArcGISRuntime.Toolkit.Controls 100.9

Rectangle {
    id: rootRectangle
    clip: true
    width: 800
    height: 600

    property var popupManagers: []
    property var featureLayer: null

    MapView {
        id: mapView
        anchors.fill: parent

        Map {
            initUrl: "https://runtime.maps.arcgis.com/home/webmap/viewer.html?webmap=e4c6eb667e6c43b896691f10cc2f1580"
        }

        // identify layers on mouse click
        onMouseClicked: {
            const screenX = mouse.x;
            const screenY = mouse.y;
            const tolerance = 12;
            const returnPopupsOnly = false;
            featureLayer = mapView.map.operationalLayers.get(0);
            mapView.identifyLayer(featureLayer, screenX, screenY, tolerance, returnPopupsOnly);
        }

        onIdentifyLayerStatusChanged: {
            if (identifyLayerStatus !== Enums.TaskStatusCompleted)
                return;

            // if layer is a feature layer, select the identify result features
            if (featureLayer.layerType === Enums.LayerTypeFeatureLayer) {
                featureLayer.clearSelection();
                const geoElements = mapView.identifyLayerResult.geoElements;

                for (let i = 0; i < geoElements.length; i++) {
                    featureLayer.selectFeature(geoElements[i]);
                }
            }

            const popups = mapView.identifyLayerResult.popups;
            // clear the list of PopupManagers
            popupManagers = [];

            for (let i = 0; i < popups.length; i++) {
                // create a popup manager
                const popupManager = ArcGISRuntimeEnvironment.createObject("PopupManager", {
                                                                               popup: popups[i]
                                                                           });
                // push popup manager to list
                popupManagers.push(popupManager);
                popupStackView.popupManagers = popupManagers;
            }
        }
    }

    PopupStackView {
        id: popupStackView
        anchors {
            top: parent.top
            bottom: parent.bottom
            right: parent.right
        }

        onPopupManagersChanged: popupStackView.show();

        onVisibleChanged: {
            if (!visible) {
                if (featureLayer.layerType === Enums.LayerTypeFeatureLayer)
                    featureLayer.clearSelection();
            }
        }
    }

    BusyIndicator {
        id: busy
        anchors.centerIn: parent
        visible: mapView.identifyLayerStatus === Enums.TaskStatusInProgress
    }
}