Создание динамического компонента QML

Я пытаюсь создать экземпляр QtMobility MapPolyline и несколько Coordinate в QML программно из функции Javascript.

Насколько я вижу, единственный способ создать новый экземпляр из функций Javascript — использовать Qt.createComponent и Qt.createQmlObject. Однако я не могу найти способ вызова createComponent, который будет работать (всегда получаю ошибку, что файл не существует). И я хотел бы избежать Qt.createQmlObject, так как это кажется очень плохой практикой.

Есть ли чистый способ добиться этого?

Component {
    id: polyGenerator
    MapPolyline {}
}

function addPoly() {
    //This next line works, but crashes when trying to add positions
    //createPoly(polyGenerator);

    var component = Qt.createComponent("Rectangle");
    console.log(component.status + " " + Component.Null);
    if (component.status == Component.Ready) {
        createPoly(component);
    } else if (component.status == Component.Error) {
        console.log("Error: " + component.errorString());
    } else {
        component.statusChanged.connect(function () {
            if (component.status == Component.Error) {
                console.log("Error: " + component.errorString());
                return;
            }
            createPoly(component);
        });
    }
}

function createPoly(component) {
    var poly = component.createObject(map);

    poly.border.color = "red";
    poly.border.width = 4;

    // I get a crash here, my guess is that I need proper Coordinate objects
    poly.addCoordinate({latitude: -34.60553, longitude: -58.38088});
    poly.addCoordinate({latitude: -34.60720, longitude: -58.38081});
    poly.addCoordinate({latitude: 34.60720, longitude: -58.38081});
    poly.addCoordinate({latitude: -34.60597, longitude: -58.37930});

    map.addMapObject(poly);
}

person Juan    schedule 14.12.2011    source источник


Ответы (1)


Qt.createComponent нуждается в URL-адресе для загрузки файла. Вот почему он жалуется на отсутствие файла; вы пытаетесь загрузить файл под названием «Прямоугольник».

Если вы просто хотите создавать объекты динамически, создайте декларативный компонент.

Component {
    id: component
    Rectangle {
    }
}

Таким образом, функция createPoly должна работать нормально.

person blakharaz    schedule 15.12.2011
comment
Да, я знаю, что для этого требуется URL. Однако, поскольку моей целью является создание экземпляра элемента QtMobility, я не знаю URL-адрес. Код примера — это результат нескольких итераций попыток заставить его работать, а бит Rectangle был просто тестом, я знаю, что он не должен работать. - person Juan; 16.12.2011
comment
Кажется, это общепринятый способ сделать это, поэтому я приму ответ. Спасибо за Ваш ответ! - person Juan; 17.12.2011