QML动态组件创建

时间:2011-12-14 23:10:20

标签: qml qt-mobility

我正在尝试使用Javascript函数在QML programmaticaly中创建QtMobility MapPolyline和几个Coordinate的实例。

据我所知,从Javascript函数创建新实例的唯一方法是使用Qt.createComponentQt.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);
}

1 个答案:

答案 0 :(得分:4)

Qt.createComponent需要一个URL来加载文件。这就是为什么它抱怨丢失的文件;您正在尝试加载名为“Rectangle”的文件。

如果您只想动态创建对象,请创建组件声明。

Component {
    id: component
    Rectangle {
    }
}

这样,createPoly函数应该可以正常工作。