2012-09-26 37 views
8

Ekibimle bir proje üzerinde çalışıyorum. İşim, Gömülü Sistem için QML ve C++ içeren bir Gui oluşturmaktır.QML değişiklik görünümüne tıklayın

Her biri için qml dosyasını görüntüle.

Ama şimdi bunların arasında gezinmek istiyorum. Bu, bir Düğmeye tıklarken görünümün değişmesi gerektiği anlamına gelir. Her Görünümün bir geri düğmesi vardır, bu yüzden Ana Görünümüm'e geri dönebilirim.

Bu, qml'de mümkündür? i

cevap

9

++ c ile çözmek zorunda Değilse Sen QDeclarativeView gelen C++ ve kullanım türetmek bir sınıf oluşturabilirsiniz:

void setSource (const QUrl & url) 

anda görüntülenen QML dosyasını değiştirmek için. Düğmeye tıklandığında bu yöntemi birden çok kez çağırabilirsiniz.

Sadece QML kullanan bir çözüm de var.

import QtQuick 1.0 
Item { 
    width: 200; height: 200 

    Loader { id: pageLoader } 

    MouseArea { 
    anchors.fill: parent 
    onClicked: pageLoader.source = "Page1.qml" 
    } 
} 
+0

Teşekkür JuliusG, ama her olmalı sürümü ile düşünmek daha örnek Loader görüntüle? Veya pageloader bunu kastettiğimi biliyor mu? – demonking

+2

Her dosyaya Loader eklemeniz gerekmez. Bir Loader ile ana qml'ye sahip olmak yeterlidir ve her görünümde bir butona her tıklandığında içeriğini değiştirebilirsiniz. Yüklenen görünümden ana qml'ye veri aktarmak için ana bir nesnenin yöntemini çağırabilirsiniz. – JuliusG

+0

Teşekkür bunu test ettik :) Ama QDeclarativeView bir ton @JuliusG yorumunuz – demonking

9

Başka bir seçenek de bu QML görüşlerini örneğini nerede bir ana QML sahip olmaktır ve durumlarını kullanarak aralarında değiştirin: Yükleyici elemanı bir göz atın.

Main { 
    View1{id:viewid1} 
    View2{id:viewid2} 
    View3{id:viewid3} 
    states: [ 
    State { 
     name: "" 
    }, 
    State { 
     name: "view1" 
     PropertyChanges {target: viewid1; state: "focused"} 
    }, 
    State { 
     name: "view2" 
     PropertyChanges {target: viewid2; state: "focused"} 
    ... 
    } 
    ] 
} 

bu seçeneği ve zaten sunulan bir arasında fark bu bir kalıcı olmasıdır, ve diğer masraflar QML (ayrıştırma ve örnekleme anlamına gelir ...) her seferinde.

+0

teşekkürler cevap :) benim günü kurtardı – demonking

+4

bakmak Bu çözüm ile @JuliusG'nin çözümü arasındaki bir başka fark, bu çözümün başlangıçta tüm QML'yi başlatmasıdır; çözümü yalnızca kaynak değiştirildiğinde, her QML sayfasını başlatır. Bu, uygulama ihtiyaçlarınıza bağlı olarak yararlı veya zararlı olabilir. – stackunderflow

4

biri Cevabınız için

import QtQuick 2.1 
import QtQuick.Controls 1.1 
import QtQuick.Window 2.1 

ApplicationWindow { 
    title: qsTr("My super app") 
    width: 640 
    height: 480 

    Button { 
     id: settingsButton 
     x: 370 
     y: 0 
     text: qsTr("Settings") 
     /* just change `visible` property by click */ 
     onClicked: { 
      statusView.visible  = false 
      settingsView.visible = true 
     } 
    } 

    Button { 
     id: statusButton 
     x: 171 
     y: 0 
     text: "Status" 
     /* toggle */ 
     onClicked: { 
      statusView.visible  = true 
      settingsView.visible = false 
     } 
    } 

    Item { 
     /* use id for access */ 
     id: statusView 
     x: 0 
     y: 50 
     width: 640 
     height: 430 
     /* visible: true */ 

     Text { 
      anchors.centerIn: parent 
      text: "status" 
     } 
    } 

    Item { 
     id: settingsView 
     x: 0 
     y: 50 
     width: 640 
     height: 430 
     /* invisible */ 
     visible: false 

     Text { 
      anchors.centerIn: parent 
      text: "settings" 
     } 
    } 
} 
+0

Teşekkürler! En pragmatik bir :-) –