Пробовал создавать объекты в QML динамически, из js файла как в примере samegame. В целом все получилось, но возникла одна проблема которую никак не придумаю как обойти.
Создаю объект из следующего qml файла
Javascript
import QtQuick 1.1
import "../../worker.js" as Worker
Item {
id: base
property bool selected: false;
property int index: 0
width: childrenRect.width
height: childrenRect.height
Rectangle {
anchors.fill: caption
color: "transparent"
visible: selected
border {color: "steelblue"; width: 2}
}
Text {
id: caption
color: "white"
}
MouseArea {
id: mouseArea
anchors.fill: parent
onPressed: Worker.changeSelection(base.index);
}
}
глобальные переменные JavaScript файла
var maxIndex = 10;
var labels = new Array(maxIndex); //массив хранящий динамически созданные объекты
Функция в которой создаются объекты:
Javascript
function addLabel(text) {
var component;
for (var i = 0; i < maxIndex; i++)
if (labels[i] == null)
{
component = Qt.createComponent("TextLabel.qml");
if (component.status == Component.Ready)
{
var dynamicObject = component.createObject(editPage);
if (dynamicObject == null) {
console.log("error creating label", component.errorString());
return false;
}
dynamicObject.selected = false;
dynamicObject.x = editPage.width/2;
dynamicObject.y = editPage.height/20;
dynamicObject.text = text;
dynamicObject.index = i;
} else {
console.log("error loading block component", component.errorString());
return false;
}
labels[i] = dynamicObject;
return true;
}
}
Функция которая вызывается по событию из созданного объекта
Javascript
function changeSelection(index) {
if (selectedLabelIndex == -1) labels[index].selected = true;
...
}
Проблема заключается в следующем - если вызывать changeSelection() из js файла или main.qml то все работает нормально, но в случае если вызвать ее из созданного объекта (onPressed: Worker.changeSelection(base.index)
то получаю сообщение об ошибке labels[index] - undefined.
Насколько я понял проблема возникла из-за того что объекты хранящиеся в labels создавались внутри addLabel() и т.к. они создавались с помощью Qt.createComponent() то им присвоился контекст addLabel() который был по выходу из функции удален и соответственно глобальную переменную labels в их контексте уже не видно. Собственно вопрос - как сменить контекст для создаваемых объектов чтобы labels в нем был виден.