J'essaie d'obtenir une référence à un objet ChartView créé dynamiquement. Dans le code, vous verrez que je crée dynamiquement un graphique en tant que délégué lorsque je clique sur le bouton « Ajouter un graphique ».

import QtQuick 2.12
import QtQuick.Window 2.12
import QtCharts 2.3
import QtQuick.Controls 2.4

Window {
    visible: true
    width: 1200
    height: 800
    title: "Charts"

    ListModel {
        id: modelId
    }

    Rectangle {
        id: rectId
        color: "pink"
        anchors.fill: parent

        GridView {
            id: mGridViewId
            anchors.fill: parent
            cellWidth: 300; cellHeight: 300
            model: modelId
            delegate: Rectangle {
                width: mGridViewId.cellWidth;
                height: mGridViewId.cellHeight
                color: mColor

                ChartView {
                    width: parent.width;
                    height: parent.height

                    LineSeries {
                        name: "LineSeries"
                        XYPoint { x: 0; y: 0 }
                        XYPoint { x: 1.1; y: 2.1 }
                        XYPoint { x: 1.9; y: 3.3 } 
                    }

                }
            }
        }
    }

    Column {
        anchors.centerIn: parent
        Row {
            Button {
                text: "add chart"

                onClicked: {                    
                   modelId.append({'mColor': 'blue'})
                }
            }


            Button {
                text: "remove chart"

                onClicked: {
                    modelId.remove(0)
                }
            }
        }

        Button {
            anchors.horizontalCenter: parent.horizontalCenter
            text: "add line series"

            onClicked: {
                var chart = modelId.get(0)
                chart.removeAllSeries();
            }
        }

    }

}

Je suis en mesure d'obtenir une référence à un élément spécifique du modèle en utilisant :

var chart = modelId.get(0)

Cependant, il n'est pas traité comme un Rectangle ni comme un ChartView. Donc, si je voulais faire quelque chose comme ajouter un LineSeries à l'un des graphiques créés dynamiquement, ou supprimer LineSeries comme ceci :

onClicked: {
    var chart = modelId.get(0)
    chart.removeAllSeries();
}

Je ne peux pas traiter l'objet comme un objet QML. J'obtiens une erreur :

qrc:/main.qml:80: TypeError: La propriété 'removeAllSeries' de l'objet QObject(0x7fd35d996b50) n'est pas une fonction

Je ne suis pas sûr de ce que je fais mal ou si je dois procéder d'une manière totalement différente, c'est-à-dire sans utiliser ListView-Model-Delegate et créer dynamiquement un objet QML et stocker les références à eux dans un tableau.

Merci pour toute aide, je l'apprécie.

--E

1
Edwin Fernandez 12 mars 2019 à 16:57

2 réponses

Meilleure réponse

Je l'ai compris, en publiant la réponse ici pour les futurs nerdlings.

J'avais besoin d'accéder à la propriété contentItem du GridView. J'ai ajouté cette fonction au GridView

function getDelegateInstanceAt(index) {
    return contentItem.children[index];
}

Et pour modifier le délégué spécifique appeler la fonction passant l'index

onClicked: {
    var chart = mGridViewId.getDelegateInstanceAt(2);
    chart.removeAllSeries();
}
1
Edwin Fernandez 12 mars 2019 à 16:31

E, si je comprends bien, vous voulez appeler le removeAllSeries () d'un seul objet qml ChartView que vous créez.

Mais...

modelId.get(0)

N'est pas l'objet qml ChartView, c'est uniquement l'élément de données que vous avez ajouté. donc l'erreur que vous obtenez est valide, car vous essayez d'accéder aux propriétés du ListModel

Si tu fais ça:

onClicked: {
    var chart = modelId.get(0)
    var color = chart.mColor
    console.log(color)
    // blue
}

Vous devez utiliser le currentItem et ou le currentIndex du GridView pour trouver le bon objet ChartView

onClicked: {
    //Gridview -> Rectangle -> ChartView -> method
    mGridViewId.currentItem.visibleChildren[0].removeAllSeries()
}

Vous pouvez vous débarrasser du rectangle supplémentaire et ne pas avoir à vous soucier des enfants visibles.

0
Martin Pausch 12 mars 2019 à 17:24