添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Hi, I am creating an app with QT Creator and am wondering how i would go about creating a legend. I could not find a legend component.

I have tried creating a custom component (listview with a model), and i scan the layerItems and retrieve the image url.

However, the url i get (sample below) does not seem to be a http endpoint. it looks like it is going in to a custom image provider, however, i am unable to see the image in my listview.

qml: image://arcgisruntimeimageprovider/cdacd5e0-39ac-4167-9adb-29a6d7a3388f/legendItem

I was wondering if someone could point me in the general direction of creating a legend component.

I am fairly new to qml/qt so i apologize for any noob questions i may have.

Thanks

Hmm, the image provider image should work with the image. Maybe you can try the legend sample that the AppStudio team has created:

main.qml:

Map {
    id: map
    anchors.fill: parent
    extent: marylandExtent
    ArcGISTiledMapServiceLayer {
        url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"
    ArcGISDynamicMapServiceLayer {
        id: dynamicService
        //url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer"
        //url: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapSe..."
        //url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/AIMS/WaterAccess20140919/MapServer"
        url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/Environment/Natural_Filters/MapServer"
        onStatusChanged: {
            if( status === Enums.MapStatusReady){
                mylegendView.updateModel();
    Envelope {
        id: marylandExtent
        xMax: -8519000
        yMax: 4814600
        xMin: -8501800
        yMin: 4821600
    Rectangle {
        id: legendRectangle
        color: "lightgrey"
        radius: 5
        border.color: "black"
        opacity: 0.77
        width: parent.width * 0.3
        anchors {
            right: parent.right
            top: parent.top
            bottom: parent.bottom
            margins: 20 * scaleFactor
    LegendView {
        id: mylegendView
        map: map
        anchors.fill: legendRectangle
        anchors.margins: 10 * scaleFactor
        criteria: ViewSection.FullString
        delegate: legendSectionDelegate
        labelPositioning: ViewSection.InlineLabels
    delegate: legendItemDelegate
    //--------------------------------------------------------------------------
    Component {
        id: legendSectionDelegate
        Item {
            width: parent.width
            height: textControl.height
            Text {
                id: textControl
                anchors.verticalCenter: parent.verticalCenter
                text: section
                width: parent.width
                font {
                    pointSize: 10
                    bold: true
                color: "#4c4c4c"
                wrapMode: Text.WrapAtWordBoundaryOrAnywhere
    //--------------------------------------------------------------------------
    Component {
        id: legendItemDelegate
        Item {
            width: parent.width
            height: Math.max(legendImage.height, legendText.height)
            Image {
                id: legendImage
                anchors {
                    left: parent.left
                    leftMargin: 5
                    verticalCenter: parent.verticalCenter
                source: image
                height: 30 * System.displayScaleFactor
                width: height
                fillMode: Image.PreserveAspectFit
            Text {
                id: legendText
                anchors {
                    verticalCenter: parent.verticalCenter
                    left: legendImage.right
                    leftMargin: 4
                    right: parent.right
                text: label
                color: "#4c4c4c"
                wrapMode: Text.WrapAtWordBoundaryOrAnywhere
                font {
                    pointSize: 10
    //--------------------------------------------------------------------------
    ListModel {
        id: legendModel
    function updateModel() {
        legendModel.clear();
        //console.log("Legend Layers", map.layerCount);
        for (var layerIndex = 0; layerIndex < map.layerCount; layerIndex++) {
            var layer = map.layerByIndex(layerIndex);
            if (!layer.visible) {
                continue;
            switch (layer.type) {
            case Enums.LayerTypeArcGISTiledMapService :
                continue;
            default:
                break;
            var legendInfos = layer.legend;
            //console.log("Legend Infos", legendInfos.length);
            for (var infoIndex = 0; infoIndex < legendInfos.length; infoIndex++) {
                var legendInfo = legendInfos[infoIndex];
                var legendItems = legendInfo.legendItems;
                //console.log("Legend Items", legendInfo.layerName, legendItems.length);
                for (var itemIndex = 0; itemIndex < legendItems.length; itemIndex++) {
                    var legendItem = legendItems[itemIndex];
                    legendModel.append(
                                    "layerName": legendInfo.layerName,
                                    "image": legendItem.image.toString(),
                                    "label": legendItem.label
    //--------------------------------------------------------------------------
						

Hmm, the image provider image should work with the image. Maybe you can try the legend sample that the AppStudio team has created:

main.qml:

Map {
    id: map
    anchors.fill: parent
    extent: marylandExtent
    ArcGISTiledMapServiceLayer {
        url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"
    ArcGISDynamicMapServiceLayer {
        id: dynamicService
        //url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer"
        //url: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapSe..."
        //url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/AIMS/WaterAccess20140919/MapServer"
        url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/Environment/Natural_Filters/MapServer"
        onStatusChanged: {
            if( status === Enums.MapStatusReady){
                mylegendView.updateModel();
    Envelope {
        id: marylandExtent
        xMax: -8519000
        yMax: 4814600
        xMin: -8501800
        yMin: 4821600
    Rectangle {
        id: legendRectangle
        color: "lightgrey"
        radius: 5
        border.color: "black"
        opacity: 0.77
        width: parent.width * 0.3
        anchors {
            right: parent.right
            top: parent.top
            bottom: parent.bottom
            margins: 20 * scaleFactor
    LegendView {
        id: mylegendView
        map: map
        anchors.fill: legendRectangle
        anchors.margins: 10 * scaleFactor
        criteria: ViewSection.FullString
        delegate: legendSectionDelegate
        labelPositioning: ViewSection.InlineLabels
    delegate: legendItemDelegate
    //--------------------------------------------------------------------------
    Component {
        id: legendSectionDelegate
        Item {
            width: parent.width
            height: textControl.height
            Text {
                id: textControl
                anchors.verticalCenter: parent.verticalCenter
                text: section
                width: parent.width
                font {
                    pointSize: 10
                    bold: true
                color: "#4c4c4c"
                wrapMode: Text.WrapAtWordBoundaryOrAnywhere
    //--------------------------------------------------------------------------
    Component {
        id: legendItemDelegate
        Item {
            width: parent.width
            height: Math.max(legendImage.height, legendText.height)
            Image {
                id: legendImage
                anchors {
                    left: parent.left
                    leftMargin: 5
                    verticalCenter: parent.verticalCenter
                source: image
                height: 30 * System.displayScaleFactor
                width: height
                fillMode: Image.PreserveAspectFit
            Text {
                id: legendText
                anchors {
                    verticalCenter: parent.verticalCenter
                    left: legendImage.right
                    leftMargin: 4
                    right: parent.right
                text: label
                color: "#4c4c4c"
                wrapMode: Text.WrapAtWordBoundaryOrAnywhere
                font {
                    pointSize: 10
    //--------------------------------------------------------------------------
    ListModel {
        id: legendModel
    function updateModel() {
        legendModel.clear();
        //console.log("Legend Layers", map.layerCount);
        for (var layerIndex = 0; layerIndex < map.layerCount; layerIndex++) {
            var layer = map.layerByIndex(layerIndex);
            if (!layer.visible) {
                continue;
            switch (layer.type) {
            case Enums.LayerTypeArcGISTiledMapService :
                continue;
            default:
                break;
            var legendInfos = layer.legend;
            //console.log("Legend Infos", legendInfos.length);
            for (var infoIndex = 0; infoIndex < legendInfos.length; infoIndex++) {
                var legendInfo = legendInfos[infoIndex];
                var legendItems = legendInfo.legendItems;
                //console.log("Legend Items", legendInfo.layerName, legendItems.length);
                for (var itemIndex = 0; itemIndex < legendItems.length; itemIndex++) {
                    var legendItem = legendItems[itemIndex];
                    legendModel.append(
                                    "layerName": legendInfo.layerName,
                                    "image": legendItem.image.toString(),
                                    "label": legendItem.label
    //--------------------------------------------------------------------------