Zaprojektowałem układ w QML, aby dowiedzieć się więcej o jego funkcjach i mam kilka pytań dotyczących "najlepszych praktyk" w projektowaniu takiego układu. Oto ona:Jak zaprojektować wielopoziomowy układ płynów w QML
Zasadniczo jest to ColumnLayout składał się z trzech RowLayout s, każdy z niektórych Prostokąt s. Wielkość każdego rzędu i prostokąta należy obliczyć na przykład jako:
- Pierwszy rząd: wysokość = 40%, szerokość = 100%
- czerwony prostokąt wypełniającego cały obszar
- drugi rząd Wysokość = 20%, szerokość = 100%
- ciemnozieloną prostokąt: Wzrost = 100%, szerokość = 20%
- jasnozielony prostokąt: Wysokość = 100%, szerokość = 80%
- Trzeci rząd: wysokość = 40%, szerokość = 100%
- Ciemnoniebieski prostokąt: wysokość = 100%, szerokość = 40%
- niebieski prostokąt: Wysokość = 100%, Szerokość = 20%
- Light-niebieski prostokąt: Wysokość = 100%, Szerokość = 40%
QML ja wymyślił działa i jest w następującym. Mam kilka pytań o tym:
- mam ustawić szerokość i wysokość procenty za pomocą Layout.preferredHeight: x * parent.height wzoru. Inne opcje powodowały pewne problemy (np. PreferredHeight powodował ostrzeżenia o pętli wiązania). Czy moje podejście jest prawidłowe i efektywne?
- Jako narzędzie hakerskie ustawiłem Layout.fillWidth: true dla pierwszego elementu wiersza nr 2 i wiersza nr 3, co nie ma dla mnie sensu, ale działa. Jeśli ustawię ich szerokość w procentach (np. Layout.preferredWidth: 0.2 * parent.width) ich rząd zwinie się do szerokości 0. Czy jest to oczekiwane zachowanie? Czy istnieje lepszy sposób obejścia tego problemu?
- Czy masz jakieś zalecenia dotyczące układów? Czy jestem na dobrej drodze?
Oto mój kod QML dla układu:
ApplicationWindow {
x: 500
y: 100
width: 250
height: 150
visible: true
ColumnLayout {
anchors.fill: parent
spacing: 0
RowLayout {
spacing: 0
Layout.preferredHeight: 0.4*parent.height
Layout.fillHeight: false
Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
color: "red"
}
}
RowLayout {
spacing: 0
Layout.preferredHeight: 0.2*parent.height
Layout.fillHeight: false
Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
color: "darkGreen"
}
Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: 0.8*parent.width
color: "lightGreen"
}
}
RowLayout {
spacing: 0
Layout.preferredHeight: 0.4*parent.height
Layout.fillHeight: false
Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
color: "darkBlue"
}
Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: 0.2*parent.width
color: "blue"
}
Rectangle {
Layout.fillHeight: true
Layout.preferredWidth: 0.4*parent.width
color: "lightBlue"
}
}
}
}
Aktualizacja:
Moje podejście wydaje się być bardziej hacky niż się spodziewałem:
- Umieszczenie Tekst elementy jako dzieci w tym układzie powodują wiązanie ing pętli ostrzeżenia takie jak:
QML QQuickLayoutAttached: pętlowy wiąże wykryta właściwość "preferredWidth"
Jeżeli oblewania o wewnątrz prostokąt ostrzeżenia zniknie.
- Rozstaw : 0 wydaje się odgrywać ważną rolę. Pominięcie go spowoduje ostrzeżenia o pętli wiązania.
Chociaż moje podejście do projektowania układów płynów w QML działa, ma pewne poważne problemy i może nie podlegać "najlepszym praktykom".
Czy możesz pokazać, gdzie w dokumentacji mówi się o ** Layout.preferredXXX **? To nie wygląda jak własność QML i nie mogłem znaleźć w dokumentacji Qt5.4. – danielfranca
Oto dokumentacja nieruchomości, której używam: http://doc.qt.io/qt-5/qml-qtquick-layouts-layout.html. BTW, nadal otrzymuję pętlę _Binding dla właściwości "preferredHeight" _ dla bardziej złożonych układów, co oznacza, że moje podejście z pewnością ma pewne wady. – Isaac
Otrzymałem _binging loop_ ostrzeżenia na innym układzie, który został zbudowany przy użyciu tego podejścia. Wygląda na to, że odstęp **: 0 ** odgrywa rolę w uniknięciu tego ostrzeżenia. Ustawienie na zero spowodowało zniknięcie niektórych ostrzeżeń. – Isaac