当 LineSeries 悬停在上方时获取 QML LineSeries 的名称 - (动态创建的 LineSeries)
Get name of QML LineSeries when the LineSeries is hovered over - (LineSeries created dynamically)
我试图在悬停时获取对动态创建的 LineSeries 的引用。创建 LinesSeries 后,我将信号处理程序附加到悬停事件。
问题是:
从下面的简化示例中,当我将鼠标悬停在 LineSeries 上时,它会打印出最后添加的 LineSeries 的名称。何时应该打印添加的每个 LineSeries 的系列名称。
例如,如果创建了 3 个 LineSeries,名称为 ["Line A"、"Line B"、"Line C"],当悬停在每个 LineSeries 上时,它应该打印每个相应的名称,而是打印 "Line C" ,对于所有 3 个 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 变量的当前值绑定到悬停的事件处理程序有关,但我不确定如何执行此操作。我知道在常规 JS 中他们会做类似
的事情
functionName.bind( { ... 代码 ... }, 这个 );
感谢您的帮助。
--E
一个可能的解决方案是在 Python 中添加类似于 functools.partial()
的参数,我们很幸运,因为在 中有一个等效的实现:
//
function partial() {
var args = Array.prototype.slice.call(arguments);
var fn = args.shift();
return function() {
var nextArgs = Array.prototype.slice.call(arguments);
// replace null values with new arguments
args.forEach(function(val, i) {
if (val === null && nextArgs.length) {
args[i] = nextArgs.shift();
}
});
// if we have more supplied arguments than null values
// then append to argument list
if (nextArgs.length) {
nextArgs.forEach(function(val) {
args.push(val);
});
}
return fn.apply(fn, args);
}
}
// ...
for(var name in dataset) {
var series = chart.createSeries(ChartView.SeriesTypeLine, name, xAxis, yAxis);
var fun = function(name, point, state){
if (state){
console.log(">>>"+ name);
}
};
series.hovered.connect(partial(fun, name));
}
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);
}
}
我试图在悬停时获取对动态创建的 LineSeries 的引用。创建 LinesSeries 后,我将信号处理程序附加到悬停事件。
问题是: 从下面的简化示例中,当我将鼠标悬停在 LineSeries 上时,它会打印出最后添加的 LineSeries 的名称。何时应该打印添加的每个 LineSeries 的系列名称。 例如,如果创建了 3 个 LineSeries,名称为 ["Line A"、"Line B"、"Line C"],当悬停在每个 LineSeries 上时,它应该打印每个相应的名称,而是打印 "Line C" ,对于所有 3 个 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 变量的当前值绑定到悬停的事件处理程序有关,但我不确定如何执行此操作。我知道在常规 JS 中他们会做类似
的事情functionName.bind( { ... 代码 ... }, 这个 );
感谢您的帮助。
--E
一个可能的解决方案是在 Python 中添加类似于 functools.partial()
的参数,我们很幸运,因为在
//
function partial() {
var args = Array.prototype.slice.call(arguments);
var fn = args.shift();
return function() {
var nextArgs = Array.prototype.slice.call(arguments);
// replace null values with new arguments
args.forEach(function(val, i) {
if (val === null && nextArgs.length) {
args[i] = nextArgs.shift();
}
});
// if we have more supplied arguments than null values
// then append to argument list
if (nextArgs.length) {
nextArgs.forEach(function(val) {
args.push(val);
});
}
return fn.apply(fn, args);
}
}
// ...
for(var name in dataset) {
var series = chart.createSeries(ChartView.SeriesTypeLine, name, xAxis, yAxis);
var fun = function(name, point, state){
if (state){
console.log(">>>"+ name);
}
};
series.hovered.connect(partial(fun, name));
}
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);
}
}