获取QML中动态创建的ChartView的引用



我正在尝试获取对动态创建的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)

但是,它不被视为矩形或图表视图。因此,如果我想做一些事情,例如在动态创建的图表之一中添加线条,或删除类似的线条:

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

我无法将对象视为QML对象。我有一个错误:

qrc:/main.qml:80:typeError:属性'removeAllseries'对象 qObject(0x7fd35d996b50)不是函数

我不确定我在做错什么,或者是否需要以完全不同的方式进行此操作,即不使用ListView-Model-delegate,而是动态创建QML对象并将其引用存储在数组中。

感谢您的任何帮助,我感谢。

- E

我弄清楚了,在此处发布了答案。

我需要访问GridView的ContentItem属性。我将此功能添加到GridView

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

并修改特定委托呼叫通过索引

的功能
onClicked: {
    var chart = mGridViewId.getDelegateInstanceAt(2);
    chart.removeAllSeries();
}

e,如果我理解这一点,您可以调用您正在创建的单个ChartView QML对象的removeAllSeries()。

但是...

modelId.get(0)

不是ChartView QML对象,而是您添加的数据元素。因此,您获得的错误是有效的,因为您尝试访问ListModel的属性

如果这样做:

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

您必须使用GridView的CurrentItem和CurrentIndex来查找正确的ChartView对象

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

您可能会摆脱额外的矩形,而不必与Visiblechildren打交道。

相关内容

  • 没有找到相关文章

最新更新