获取对 QML 中动态创建的 ChartView 的引用
Getting reference to dynamically created ChartView in QML
我正在尝试获取对动态创建的 ChartView 对象的引用。在代码中,您将看到我在单击 'add chart' 按钮时动态创建了一个图表作为委托。
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)
但是它不被视为矩形或图表视图。因此,如果我想做一些事情,比如将 LineSeries 添加到动态创建的图表之一,或者像这样删除 LineSeries:
onClicked: {
var chart = modelId.get(0)
chart.removeAllSeries();
}
我无法将该对象视为 QML 对象。我得到一个错误:
qrc:/main.qml:80: TypeError: Property 'removeAllSeries' of object
QObject(0x7fd35d996b50) is not a function
我不确定我做错了什么,或者我是否需要以完全不同的方式解决这个问题,即不使用 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()
}
你可能会去掉多余的 Rectangle 而不必处理 visibleChildren。
我正在尝试获取对动态创建的 ChartView 对象的引用。在代码中,您将看到我在单击 'add chart' 按钮时动态创建了一个图表作为委托。
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)
但是它不被视为矩形或图表视图。因此,如果我想做一些事情,比如将 LineSeries 添加到动态创建的图表之一,或者像这样删除 LineSeries:
onClicked: {
var chart = modelId.get(0)
chart.removeAllSeries();
}
我无法将该对象视为 QML 对象。我得到一个错误:
qrc:/main.qml:80: TypeError: Property 'removeAllSeries' of object QObject(0x7fd35d996b50) is not a function
我不确定我做错了什么,或者我是否需要以完全不同的方式解决这个问题,即不使用 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()
}
你可能会去掉多余的 Rectangle 而不必处理 visibleChildren。