2013-07-29 13 views
11

Sto lavorando con QML e voglio aggiungere elementi a SplitView dinamicamente ad es. onMouseClick, ma finora non ho trovato la risposta.Aggiungere elementi dinamicamente a SplitView in QML

Quello che ho scoperto finora è che il SplitView ha la proprietà di default impostata sulla proprietà data del primo figlio. Quindi penso che dovrei provare ad aggiungere nuovi componenti creati dinamicamente con il genitore impostato su quel bambino (splitView1.children[0]). Purtroppo non funziona neanche. Inoltre, il numero di figli di quel primo figlio è zero dopo il completamento del caricamento del componente (sembra che l'evento Component.onCompleted di SplitLayout richiami una funzione che sposta questi bambini da qualche altra parte). Pertanto i bambini aggiunti non eseguono il rendering (e non rispondono a nessuna delle proprietà associate al layout).

prega di consultare il seguente frammento di codice:

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 
     } 
    } 
} 

C'è un modo per rendere i componenti creati in modo dinamico rendono correttamente nel SplitView come quelli aggiunti in modo statico?

risposta

3

Sembra che l'API non fornisca supporto per l'inserimento dinamico di nuovi elementi. Anche se lo fai funzionare, sarebbe un trucco e potrebbe rompersi con le versioni future. Potrebbe essere necessario eseguire il controllo personale per simulare il comportamento desiderato. Idealmente dovrebbe essere supportato da una sorta di modello.

0

è necessario utilizzare il caricatore per caricare oggetti dinamici. in onClicked gestire si deve dichiarare proprietà sourceComponent per cambiare la sorgente del Loader, qualcosa di simile:

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

Questa è una soluzione molto scarsa in quanto è necessario conoscere quanti oggetti sono necessari in anticipo, il che è raro il caso. – cmannett85

0

ho visto il codice sorgente di SplitView, si calcola ogni regione divisa quando Component.onCompleted segnale. Quindi penso che sia un punto chiave. Non importa come fai (inserisci, crea dinamicamente). La regione non verrà ripristinata dopo aver inserito una nuova regione per la divisione.

3

A partire da QtQuick Controls 1.3, SplitView ha un addItem(item)method.

Problemi correlati