Wenn Sie mit dem GridLayout
zufrieden sind, nur die automatische Etiketten Generation fehlt, können Sie sich einige kleine Hilfsklasse erstellen, in dem Sie die Label
einkapseln und eine Eigenschaft für die Kontrolle halten.
// FormControl.qml
import QtQuick 2.0
import QtQuick.Controls 2.0
Item {
id: root
property alias label: myLabel
Label {
id: myLabel
parent: root.parent
Layout.fillHeight: true
Layout.fillWidth: true
verticalAlignment: Qt.AlignVCenter
MouseArea {
anchors.fill: parent
onClicked: root.control.forceActiveFocus()
}
}
property Item control
Row {
id: content
parent: myLabel.parent // parent it to myLabel.parent, to make sure, that one is added first.
children: [control]
}
}
Die Verwendung ist einfach:
import QtQuick 2.7
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.0
ApplicationWindow {
id: myWindow
visible: true
width: 600
height: 600
color: 'white'
GridLayout {
columns: 2
FormControl {
label.text: 'test1'
control: ComboBox {
model: ['hello', 'world', 'and', 'bye']
}
}
FormControl {
label.text: 'Text'
control: TextField {
}
}
FormControl {
label.text: 'Something Long'
control: TextField {
}
}
}
}
Sie könnten die control
weglassen, wenn Sie es das default property Item control
in FormControl.qml
erklären. Dann könnten Sie jedoch versehentlich mehrere Steuerelemente hinzufügen, wobei das erste verloren geht.
Ich nutze die , um von der impliziten Höhe und Breite zu profitieren, aber Sie könnten auch eine Item
verwenden und die Breite und Höhe auf childrenRect.width/height
setzen. Ich bin mir jedoch nicht sicher, ob das robust ist.
Da ich mit dem 'QFormLayout' nicht vertraut bin, können Sie bitte erklären, was Sie zu tun versuchen und wie Sie es verwenden möchten? – derM
Ich versuche, einen sehr einfachen Dialog mit mehreren Eingabefeldern zu implementieren. Jedes Eingabefeld sollte sein eigenes Label haben.Wenn ein Benutzer versehentlich auf das Label anstelle des Eingabeelements klickt, möchte ich, dass das Eingabeelement fokussiert wird (Buddy-Funktionalität). Ich denke, es wäre besser, wenn ich nicht selbst Labels erstellen müsste und ein FormLayout das tun müsste (wie in QtWidgets). Ich wollte nur den kanonischsten Weg gehen. –