Qml QFormLayout等效于QtQuick2?
我正在将基于QtWidgets的应用程序移植到QtQuick2 我正在尝试找出我应该使用哪些快速布局项 我被困在QFormLayout上。我根本找不到一个等价物。我能找到的最好的是GridLayout,但我希望标签能够自动生成() 转换为Qml QFormLayout等效于QtQuick2?,qml,qt5,qtquick2,qlayout,Qml,Qt5,Qtquick2,Qlayout,我正在将基于QtWidgets的应用程序移植到QtQuick2 我正在尝试找出我应该使用哪些快速布局项 我被困在QFormLayout上。我根本找不到一个等价物。我能找到的最好的是GridLayout,但我希望标签能够自动生成() 转换为 转换为 转换为 转换为?据我所知,QML中没有与QFormLayout等效的格式 您必须自己用and定义组件 您可以在此处找到一些详细信息: 一个例子 FormLayout.qml: main.qml: 标签可以是(c++中的JS数组、ListModel或Ab
转换为
转换为
转换为?据我所知,QML中没有与
QFormLayout
等效的格式
您必须自己用and定义组件
您可以在此处找到一些详细信息:
一个例子
FormLayout.qml:
main.qml:
标签可以是(c++中的JS数组、ListModel或AbstractItemModel)
如果您对GridLayout
感到满意,只是缺少自动标签生成,那么您可以自己创建一些小的帮助器类,在其中封装标签
,并保留控件的属性
//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]
}
}
用法很简单:
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 {
}
}
}
}
在FormControl.qml
中将控件声明为默认属性项控件时,可能会忽略该控件。然而,您可能会突然添加多个控件,其中第一个控件将丢失
我使用行
从隐式的高度和宽度中获益,但您也可以使用项
并将宽度和高度设置为它的childrenRect.width/height
。但是,我不确定这是否可靠。由于我不熟悉QFormLayout
请您解释一下,您正在尝试做什么,以及打算如何使用它?我正在尝试实现一个具有多个输入字段的非常简单的对话框。每个输入字段都应该有自己的标签。如果用户不小心单击了标签而不是输入项,我希望输入项处于焦点状态(好友功能)。我认为如果我不必自己创建标签,而让FormLayout来创建标签(与QtWidgets中相同),那会更好。我只是想用最规范的方法。我可以用数组来表示项目本身吗?它们每行都不同,我还需要设置它们的属性。我可以在Qt知道哪个标签属于哪个项目的情况下启用buddy功能吗?可以,请参阅@derM solution,它更适合您。至于buddy的功能,我认为没有对等的功能。但我怀疑你会在QML中需要它!你可以,至少设置一个活动焦点。在第一个中继器的文本中添加MouseArea
onClicked:secondRepeater.itemAt(index.forceActiveFocus()
。但是它不会打开组合框的弹出窗口。我不知道为什么,但是FormControl会以相反的顺序显示:
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]
}
}
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 {
}
}
}
}