Динамическое создание кнопки в QML

С qt 5.2 я пытаюсь динамически добавить простую кнопку, подобную этой:

ApplicationWindow
{
    id: appWindow

    width: 640
    height: 420
    minimumHeight: 400
    minimumWidth: 600

    function addButton() {

        var obj = Qt.createComponent("Button.qml");

        if (obj.status == obj.Ready)
        {
            var button = obj.createObject(appWindow);
            button.color = "red";
            button.width=50;
            button.height=80;
            button.x=50; button.y=50;
           }
     }


    Button {
        anchors.centerIn: parent;
        text: "ok";

        onClicked: {
            addButton();
        }
    } ...

Но сразу после createComponent я всегда получаю:

QQmlComponent: Компонент не готов

Что случилось ?


person Stef    schedule 25.01.2014    source источник
comment
В соответствии с примером здесь. object.status необходимо проверить на равенство (==) с перечислением Component.Ready. А так же можно печатать, такие ошибки if (component.status == Component.Error) { // Error Handling console.log("Error loading component:", component.errorString()); } надеюсь, функция addButton не разрешена в статическом компоненте Button. Поэтому попробуйте добавить appWindow.addButton(); в обработчик события onClicked.   -  person RajaRaviVarma    schedule 27.01.2014
comment
Я добавил оператор импорта в начало файла, и он работает правильно, без ошибок. я вижу кнопку   -  person Kakadu    schedule 27.01.2014


Ответы (1)


Чтобы быть уверенным, что компонент будет готов, лучше всего просто объявить его внутри части QML, внутри объекта Component, чтобы он был предварительно загружен одновременно с остальной частью файла:

ApplicationWindow {
    id: appWindow;

    Component {
        id: myButton;

        Button { }
    }

    function addButton () {
        var button = myButton.createObject (appWindow, {
                                                "color"  : "red",
                                                "width"  : 50,
                                                "height" : 80,
                                                "x"      : 50, 
                                                "y"      : 50
                                            });
    }

    ...
}

Как видите, я также взял на себя смелость показать вам синтаксис для создания объекта напрямую с хорошими свойствами за один раз, вместо того, чтобы задавать их вручную старым школьным способом. Гораздо более чистый код и, вероятно, более производительный.

person TheBootroo    schedule 15.02.2014