【发布时间】:2019-08-17 12:47:01
【问题描述】:
我正在尝试将系列按需添加到使用 python 在 qml 中定义的现有 ChartView 中。我找到了一个示例,它展示了如何在 C++ 中执行此操作(取自 https://doc.qt.io/archives/qt-5.11/qml-qtcharts-chartview.html#createSeries-method):
// lineSeries is a LineSeries object that has already been added to the ChartView; re-use its axes
var myAxisX = chartView.axisX(lineSeries);
var myAxisY = chartView.axisY(lineSeries);
var scatter = chartView.createSeries(ChartView.SeriesTypeScatter, "scatter series", myAxisX, myAxisY);
但我找不到在 python 中执行此操作的方法。以下是我目前尝试的一些 sn-ps:
QML sn-p(最初只有 1 个散点系列):
ChartView {
id: bscan0
ScatterSeries{
id: hits0
axisX: ValueAxis {
id: bscan0_xAxix
min: 0
max: 10
}
axisY: ValueAxis {
id: bscan0_yAxis
min: -105
max: 1
}
}
QML js 函数将 chartView 传递给 python,以便它可以添加另一个系列:
dataModel.addChartSeries(bscan0, hits0)
addChartSeries 的 Python sn-p:
@Slot(QObject, QObject)
def addChartSeries(self, chartView, chart_series):
myAxisX = chartView.axisX(chart_series) # reuse the axis from existing series
myAxisY = chartView.axisY(chart_series) # reuse the axis from existing series
# This function equivalent to the c++ one doesn't exit
# myChartSeries = chartView.createSeries(QtCharts.SeriesTypeScatter, "scatter series", myAxisX, myAxisY)
# So try another way:
myChartSeries = QtCharts.QScatterSeries()
myChartSeries.setName("scatter series")
myChartSeries.attachAxis(myAxisX)
myChartSeries.attachAxis(myAxisY)
myChartSeries.append(5, -10)
myChartSeries.append(5, -20)
myChartSeries.append(5, -30)
# Try to get chart from existing series. Doesn't work
# Error says that chart_series is not in a chart (it is!)
# myChart = chart_series.chart()
# Series not in the chart. Please addSeries to chart first.
# Try to get chart from chartview passed across. Doesn't work
# Error says that object has no .chart attribute (same for .chart and .chart()):
# myChart = chartView.chart
# Error: 'PySide2.QtQuick.QQuickItem' object has no attribute 'chart'
# It seems I must add series to chart like this, not to chartView,
# but I can't find a way to get the chart for the chartView.
# myChart.addSeries(myChartSeries)
上面的python函数在我的类“dataModel”中,我像这样传递给QML(数据模型类可以很好地用于我用它做的许多其他事情,所以没有问题):
dataModel = DataModel()
self.rootContext().setContextProperty("dataModel", dataModel)
【问题讨论】: