我试图获取对动态创建的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)
但是,它不会被视为Rectangle或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
答案 0 :(得分:0)
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()
}
您可以摆脱多余的Rectangle,而不必处理visibleChildren。