我试图将鼠标悬停在动态创建的LineSeries上。创建LinesSeries之后,我将信号处理程序附加到悬停的事件上。
问题是:
从下面的简化示例中,当我将鼠标悬停在LineSeries上时,它会打印出最后添加的LineSeries的名称。什么时候应该打印添加的每个LineSeries的系列名称。
例如,如果创建的3个LineSeries的名称为[“ Line A”,“ Line B”,“ Line C”],则将鼠标悬停在每个LineSeries上时,应打印每个对应的名称,而对所有3个都打印“ Line C” LineSeries悬停的事件处理程序。我在做什么
错误?
//dataset is a dictionary(QVariant) of items where each item is the name of the line series
for(var name in dataset) {
var series = chart.createSeries(ChartView.SeriesTypeLine, name, xAxis, yAxis);
series.name = name;
series.hovered.connect(
function (point,state){
if (state){
console.log(">>>"+ name); // <- should print the name of each series
}
});
我感觉这与将name变量的当前值绑定到onhovered事件处理程序有关,但是我不确定如何执行此操作。我知道在普通的JS中,它们会像
functionName.bind({... code ...},this);
谢谢你的帮助。
--E
最佳答案
name
包含迭代完成时数组的最后一个值,因此连接处理程序将始终采用该值。为了避免这种行为,您应该使用闭包,如下所示:
Component.onCompleted: {
var dataset = ["aaa","bbb","ccc"];
for(var name in dataset) {
var series = chart.createSeries(ChartView.SeriesTypeLine, dataset[name], xAxis, yAxis);
(function(series){
series.name = dataset[name];
series.hovered.connect(function (point, state)
{
if (state)
{
console.log(series.name);
}
});
})(series);
}
}