Ho progettato un layout in QML per saperne di più sulle sue funzioni e ho alcune domande sulle "Best Practice" nella progettazione di tale layout. Qui è:Come progettare un layout fluido a più livelli in QML
È essenzialmente un ColumnLayout consisteva di tre RowLayout s, ognuno con alcune rettangolo s. La dimensione di ogni riga e Rettangolo dovrebbe essere calcolare quali:
- Prima fila: Altezza = 40%, Larghezza = 100%
- Rosso Rettangolo riempiendo l'intera area
- Seconda fila : Altezza = 20%, Larghezza = 100%
- scuro-verde rettangolo: Altezza = 100%, Larghezza = 20%,
- verde chiaro rettangolo: Altezza = 100%, Larghezza = 80%
- Terza riga: Altezza = 40%, Larghezza = 100%
- blu scuro rettangolo: Altezza = 100%, Larghezza = 40%,
- rettangolo blu: Altezza = 100%, Larghezza = 20%
- Light-rettangolo blu: Altezza = 100%, Larghezza = 40%
Il QML che ho si avvicinò con sta lavorando ed è nel seguente. Ho alcune domande su di esso:
- ho esposto le percentuali di larghezza e altezza utilizzando Layout.preferredHeight: x * parent.height modello. Altre opzioni hanno causato alcuni problemi (ad esempio preferredHeight ha causato avvisi di loop vincolanti). Il mio approccio è corretto ed efficiente?
- Come trucco, ho impostato Layout.fillWidth: true per il primo elemento della riga 2 e della riga 3, che non ha senso per me, ma funziona. Se imposto la loro larghezza in percentuale (ad esempio Layout.preferredWidth: 0.2 * parent.width), la loro riga verrà ridotta alla larghezza 0. Si tratta di un comportamento previsto? C'è qualche soluzione migliore?
- Avete suggerimenti sui layout? Sono sulla buona strada?
Ecco il mio codice QML per il layout:
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"
}
}
}
}
Aggiornamento:
Il mio approccio sembra essere più hacky di quanto mi aspettassi:
- Mettere Testo elementi come bambini in questo layout genera binding ing ciclo avvertimenti come:
QML QQuickLayoutAttached: ciclo Binding rilevato per la proprietà "preferredWidth"
Se un involucro di testo all'interno di un rettangolo gli avvertimenti scompaiono.
- La spaziatura : 0 sembra svolgere un ruolo importante. Omettendo causerà avvertimenti di loop vincolanti.
Mentre il mio approccio alla progettazione del layout fluido in QML funziona, presenta alcuni problemi gravi e potrebbe non rientrare nelle "migliori pratiche".
Puoi mostrare dove nella documentazione indica il ** Layout.preferredXXX **? Non sembra una proprietà QML e non ho potuto trovare nella documentazione di Qt5.4. – danielfranca
Ecco la documentazione per la proprietà che sto usando: http://doc.qt.io/qt-5/qml-qtquick-layouts-layout.html. A proposito, sto ancora ricevendo _Binding loop rilevato per la proprietà "preferredHeight" _ per layout più complessi, il che significa che il mio approccio ha certamente alcuni difetti. – Isaac
Stavo ricevendo _binging loop_ warnings su un altro layout che è stato creato utilizzando questo approccio. Apparentemente la spaziatura **: 0 ** ha un ruolo nell'evitare questo avvertimento. Impostandolo su zero, alcuni avvisi spariscono. – Isaac