Получение ссылки на динамически создаваемый ChartView в QML - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь получить ссылку на динамически созданный объект ChartView. В коде вы увидите, что я динамически создаю диаграмму в качестве делегата, когда нажимаю кнопку «добавить диаграмму».

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();
            }
        }

    }

}

Я могу получить ссылку на конкретный элемент Модели, используя:

var chart = modelId.get(0)

Однако он не рассматривается ни как прямоугольник, ни как ChartView. Поэтому, если я хотел сделать что-то вроде добавления LineSeries в одну из динамически создаваемых диаграмм, или удалить LineSeries следующим образом:

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

Я не могу обработать объект как объект QML. Я получаю ошибку:

qrc: /main.qml: 80: TypeError: Свойство 'removeAllSeries' объекта QObject (0x7fd35d996b50) не является функцией

Я не уверен, что я делаю это неправильно или мне нужно пойти по-другому, то есть не использовать ListView-Model-Delegate и вместо этого динамически создавать объект QML и сохранять ссылки на них в массиве .

Спасибо за любую помощь, я ценю это.

- E

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Я понял это, разместив здесь ответ для будущих ботаников.

Мне нужно было получить доступ к свойству contentItem GridView. Я добавил эту функцию в GridView

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

и для изменения конкретного делегата вызовите функцию, передающую индекс

onClicked: {
    var chart = mGridViewId.getDelegateInstanceAt(2);
    chart.removeAllSeries();
}
0 голосов
/ 12 марта 2019

E, если я правильно понимаю, вам нужно вызвать removeAllSeries () одного создаваемого вами объекта ChartView qml.

но ...

modelId.get(0)

это не объект ChartView qml, это только добавленный вами элемент данных. поэтому полученная ошибка действительна, потому что вы пытаетесь получить доступ к свойствам ListModel

если вы сделаете это:

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

Вы должны использовать currentItem и / или currentIndex GridView, чтобы найти правильный объект ChartView

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

вы можете избавиться от лишнего прямоугольника и вам не придется иметь дело с visibleChildren.

...