2013-07-29 13 views
11

Pracuję z QML i chcę dynamicznie dodawać elementy do SplitView, np. onMouseClick, ale jak dotąd nie znalazłem odpowiedzi.Dodaj elementy dynamicznie do SplitView w QML

Do tej pory odkryłem, że SplitView ma domyślną właściwość ustawioną na własność tego pierwszego dziecka: data. Sądzę więc, że powinienem spróbować dodać nowe dynamicznie utworzone komponenty z zestawem rodzica do tego dziecka (splitView1.children[0]). Niestety to też nie działa. Co więcej, liczba dzieci tego pierwszego dziecka wynosi zero po zakończeniu ładowania komponentu (wydaje się, że zdarzenie SplitLayout Component.onCompleted wywołuje funkcję, która przenosi te dzieci w inne miejsce). W ten sposób dodane dzieci nie renderują (i nie reagują na żadną z właściwości dołączonych do Układu).

proszę zobaczyć następujący fragment kodu:

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

jest jakiś sposób mogę dynamicznie tworzone elementy czynią właściwie w SplitView co statycznie dodanych te?

Odpowiedz

3

Wygląda na to, że interfejs API nie obsługuje dynamicznego wstawiania nowych elementów. Nawet jeśli sprawisz, że zadziała, będzie to hack i może zepsuć się z przyszłymi wydaniami. Być może trzeba rzucić własną kontrolę, aby naśladować zachowanie, które chcesz. Idealnie powinien być wspierany przez jakiś model.

0

musisz użyć modułu ładującego do załadowania obiektów dinamicaly. w onClicked obsługiwać trzeba zadeklarować właściwość sourceComponent zmienić źródło Ładowarka, coś takiego:

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

To bardzo słabe rozwiązanie, ponieważ musisz wiedzieć, ile przedmiotów będziesz potrzebował wcześniej, co rzadko się zdarza. – cmannett85

0

Widziałem kodu źródłowego SplitView, obliczyć każdy region podzielony gdy Component.onCompleted sygnał. Myślę, że to kluczowa kwestia. Nie ważne jak to zrobisz (wstaw, dynamiczne tworzenie). Region nie zostanie zresetowany po wstawieniu nowego regionu do podziału.

Powiązane problemy