QML动态添加按钮

问题描述:

我写了一个简单的代码,问题是如何将按钮添加到第一页而不是第二页。我有三个calsses(main.qml,componentCreation.js,ButtonD.qml)QML动态添加按钮

import QtQuick 2.7 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.3 
import "componentCreation.js" as MyScript 

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 
    property var position: 0 

    Rectangle{ 
     id: main 
     color: "#FFFFFF" 
     width: parent.width 
     height: parent.height 
     x:200 
     y:0 
     focus: true 

     StackView{ 
      id: stack 
      initialItem: firstPage 
      Component{ 
       id: firstPage 
       Rectangle{ 
        id:firstRect 
        Label{ 
         text: "firstPage" 
         x:100 
        } 
        Button{ 
         text: "next" 
         onClicked:{ 
          MyScript.createSpriteObjects(position) 
          position+=50 
          stack.push(secondPage) 
         } 
        } 
       } 
      } 
      Component{ 
       id: secondPage 
       Rectangle{ 
        id:secondRect 
        Label{ 
         text: "secondPage" 
         x:100 
        } 
        Button{ 
         text: "back" 
         onClicked: stack.push(firstPage) 
        } 
       } 
      } 
     } 
    } 
} 
在QT网站描述

JavaScript代码(componentCreation.js)

var component; 
    var sprite; 
    function createSpriteObjects(number) { 
     component = Qt.createComponent("ButtonD.qml"); 
     if (component.status == Component.Ready) 
      finishCreation(number); 
     else 
      component.statusChanged.connect(finishCreation); 
    } 
    function finishCreation(number) { 
     if (component.status == Component.Ready) { 
      sprite = component.createObject(main, {"x": 50, "y": number}); 
      number += 50 
      if (sprite == null) { 
       console.log("Error creating object"); 
      } 
     } else if (component.status == Component.Error) { 
      console.log("Error loading component:", component.errorString()); 
     } 
    }  

按钮,我想添加

import QtQuick 2.0 
import QtQuick.Controls 1.4 
Button{ 
    text: "created" 
} 
+0

一个最小的例子会有所帮助。看起来答案取决于我们无法访问的代码。 – Mitch

+0

增加了qml代码... – Someone

+0

'createObject()'总体上令人困惑。尝试使用数据模型和中继器。 – Velkan

what should I write in

sprite = component.createObject(main, {"x": 100, "y": 500}); 

instead of main? i want to add a button from the javascript code to the rectangle with id secondRect

这给CreateObject第一个参数是要添加对象到项目的ID,所以不是答案小号econdRect?

+0

nope,“ReferenceError:secondRect is not defined”是错误 – Someone

好吧,就像米奇已经指出你的示例代码不完整。

但是,我认为的问题是,finishCreation()函数不知道'主'ID。

var component; 
var sprite; 

    function createSpriteObjects() { 
     component = Qt.createComponent("ButtonD.qml"); 
     if (component.status == Component.Ready) 
      finishCreation(); 
     else 
      component.statusChanged.connect(finishCreation); 
    } 

    function finishCreation() { 
     if (component.status == Component.Ready) { 
      sprite = component.createObject(main, {"x": 100, "y": 500}); 
      if (sprite == null) { 
       // Error Handling 
       console.log("Error creating object"); 
      } 
     } else if (component.status == Component.Error) { 
      // Error Handling 
      console.log("Error loading component:", component.errorString()); 
     } 
    } 

因此,也许你应该参考传递给以上(未经测试)功能:

var component; 
    var sprite; 

     function createSpriteObjects(parentId) { 
      component = Qt.createComponent("ButtonD.qml"); 
      if (component.status == Component.Ready) { 
       if (component.status == Component.Ready) { 
       sprite = component.createObject(parentId, {"x": 100, "y": 500}); 
       if (sprite == null) { 
       // Error Handling 
       console.log("Error creating object"); 
       } 
      } else if (component.status == Component.Error) { 
       // Error Handling 
       console.log("Error loading component:", component.errorString()); 
      }     
      } else { 
       var thatParentId = parentId; 
       component.statusChanged.connect(function() { 
        if (component.status == Component.Ready) { 
        sprite = component.createObject(thatParentId, {"x": 100, "y": 500}); 
        if (sprite == null) { 
         // Error Handling 
         console.log("Error creating object"); 
        } 
        } else if (component.status == Component.Error) { 
        // Error Handling 
        console.log("Error loading component:", component.errorString()); 
        }  
       }); 
     } 
    } 

之后,你可以调用MyScripts.createSpriteObjects(secondRect);

+0

谢谢,但它不会工作 - 我已经编辑问题 – Someone

+0

你能请我的代码应用到你的示例项目?在你编辑的答案中,我没有看到你已经使用我的代码。 – sk2212

+0

按钮{ 文字: “下一个” onClicked:{ MyScript.createSpriteObjects(secondPage) 位置+ = 50 stack.push(secondPage) }} ////// componentCreation.js是你写的这就是我所说的,它说:创建的图形对象不放在图形场景中。 – Someone