在QML

2014-01-25 19 views
2

按钮使用Qt 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

根据示例[here](https://qt-project.org/doc/qt-5.0/qtqml/qtqml-javascript-dynamicobjectcreation.html)。必须使用'Component.Ready'枚举检查'object.status'是否相等('==')。并且你也可以打印,像这样的错误 'if(component.status == Component.Error){ // Error Handling console.log(“Error loading component:”,component.errorString()); }' 我希望'addButton'函数在静态Button组件中没有解析。因此,请尝试在'onClicked'事件处理程序中添加'appWindow.addButton();'。 – RajaRaviVarma

+0

我已经将import语句添加到文件的开头,并且它可以正确运行而不会出错。我看到一个按钮 – Kakadu

回答

2

为了确保组件准备就绪,最好的方法是简单地在Component对象内部的QML部分中声明它,以便它将与文件的其余部分同时被预加载:

ApplicationWindow { 
    id: appWindow; 

    Component { 
     id: myButton; 

     Button { } 
    } 

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

    ... 
} 

正如你所看到的,我也冒昧向您展示的语法与良好性能的一次拍摄中直接创建对象,而不是在老同学的方式进行手动设置。更干净的代码,可能更高性能。