2013-07-29 17 views
11

Ich arbeite mit QML und möchte Elemente dynamisch in SplitView hinzufügen, zB. onMouseClick, aber bisher habe ich keine Antwort gefunden.Elemente dynamisch zu SplitView in QML hinzufügen

Was ich bisher herausgefunden habe, ist, dass die SplitView ihre Standardeigenschaft auf die Eigenschaft data des ersten Kindes hat. Also ich denke, ich sollte versuchen, neue dynamisch erstellte Komponenten mit dem übergeordneten Set zu diesem Kind hinzufügen (splitView1.children[0]). Leider funktioniert das auch nicht. Darüber hinaus ist die Anzahl der untergeordneten Elemente dieses ersten untergeordneten Elements null, nachdem die Komponente geladen wurde (es scheint, als ob das Component.onCompleted-Ereignis von SplitLayout eine Funktion aufruft, die diese untergeordneten Elemente an eine andere Stelle verschiebt). Die hinzugefügten untergeordneten Elemente werden daher nicht gerendert (und reagieren nicht auf die angefügten Layout-Eigenschaften).

Bitte beachten Sie den folgenden Code-Schnipsel:

import QtQuick 2.1 
import QtQuick.Controls 1.0 
import QtQuick.Layouts 1.0 

ApplicationWindow { 
    width: 600 
    height: 400 

    SplitView { 
     anchors.fill: parent 

     Rectangle { 
      id: column 
      width: 200 
      Layout.minimumWidth: 100 
      Layout.maximumWidth: 300 
      color: "lightsteelblue" 
     } 

     SplitView { 
      id: splitView1 
      orientation: Qt.Vertical 
      Layout.fillWidth: true 

      Rectangle { 
       id: row1 
       height: 200 
       color: "lightblue" 
       Layout.minimumHeight: 1 
      } 

//   Rectangle {    //I want to add Rectangle to splitView1 like this one, but dynamicly eg.onMouseClick 
//    color: "blue" 
//   } 
     } 
    } 

    MouseArea { 
     id: clickArea 
     anchors.fill: parent 
     onClicked: { 
      console.debug("clicked!") 
      console.debug("len: " + splitView1.__contents.length); // __contents is the SplitView's default property - an alias to the first child's data property 

      var newObject = Qt.createQmlObject('import QtQuick 2.1; Rectangle {color: "blue"}', 
       splitView1, "dynamicSnippet1"); //no effect 

//   var newObject = Qt.createQmlObject('import QtQuick 2.1; import QtQuick.Layouts 1.0; Rectangle {color: "blue"; width: 50; height: 50}', 
//    splitView1, "dynamicSnippet1"); //rectangle visible, but not in layout(?) - not resizeable 
     } 
    } 
} 

Gibt es eine Möglichkeit, die dynamisch erstellten Komponenten ordnungsgemäß in den SplitView als die statisch hinzugekommenen machen machen können?

Antwort

3

Es scheint, dass die API keine Unterstützung für das dynamische Einfügen neuer Elemente bietet. Selbst wenn Sie es zur Arbeit bringen, wäre es ein Hack und könnte mit zukünftigen Versionen brechen. Möglicherweise müssen Sie Ihr eigenes Steuerelement rollen, um das gewünschte Verhalten nachzuahmen. Im Idealfall sollte es von einer Art Modell unterstützt werden.

0

müssen Sie den Loader für load dinamicaly Objekte verwenden. in onClicked handhaben Sie sourceComponent Eigenschaft zu ändern, um die Quelle des Loader, um so etwas zu erklären haben:

ApplicationWindow { 
width: 600 
height: 400 

SplitView { 
    anchors.fill: parent 

    Rectangle { 
     id: column 
     width: 200 
     Layout.minimumWidth: 100 
     Layout.maximumWidth: 300 
     color: "lightsteelblue" 
    } 

    SplitView { 
     id: splitView1 
     orientation: Qt.Vertical 
     Layout.fillWidth: true 

     Rectangle { 
      id: row1 
      height: 200 
      color: "lightblue" 
      Layout.minimumHeight: 1 
     } 
    Loader { 
     id:rect 
    } 


    } 
} 

MouseArea { 
    id: clickArea 
    anchors.fill: parent 
    onClicked: { 
     console.debug("clicked!") 
     console.debug("len: " + splitView1.__contents.length) // __contents is the SplitView's default property - an alias to the first child's data property 
     rect.sourceComponent = algo 
    } 
} 

Component { 
    id:algo 
Rectangle { 
    anchors.fill: parent 
    color: "blue" 
} 
} 
} 
+0

Dies ist eine sehr schlechte Lösung, wie Sie wissen, wie viele Objekte, die Sie im Voraus benötigen, was selten der Fall ist. – cmannett85

0

Ich sah den Quellcode der Splitview, es jede geteilte Region berechnen, wenn das Signal Component.onCompleted. Ich denke, das ist ein wichtiger Punkt. Egal wie Sie es tun (einfügen, dynamisch erstellen). Die Region wird nicht zurückgesetzt, nachdem Sie eine neue Region zum Teilen eingefügt haben.

3

Ab QtQuick Bedienelemente 1.3, SplitView hat eine addItem(item)method.

Verwandte Themen