2014-01-25 2 views
2

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

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 : Компонент не готов

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

+1

В соответствии с примером [здесь] (https://qt-project.org/doc/qt-5.0/qtqml/qtqml-javascript-dynamicobjectcreation.html). Элемент 'object.status' должен быть проверен на равенство (' == ') с перечнем' Component.Ready'. А также вы можете печатать, такие ошибки 'if (component.status == Component.Error) { // Обработка ошибок console.log (« Ошибка загрузки компонента: », component.errorString()); } ' Надеюсь, функция' addButton' не будет разрешена в статическом компоненте Button. Поэтому попробуйте добавить 'appWindow.addButton();' в обработчик события onClicked. – RajaRaviVarma

+0

Я добавил оператор импорта в начало файла и работает корректно без ошибок. Я вижу кнопку – Kakadu

ответ

2

Чтобы убедиться, что компонент будет готов, лучше всего объявить его внутри части 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 
              }); 
    } 

    ... 
} 

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

Смежные вопросы