Qml QFormLayout等效于QtQuick2?

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

我正在将基于QtWidgets的应用程序移植到QtQuick2

我正在尝试找出我应该使用哪些快速布局项

我被困在QFormLayout上。我根本找不到一个等价物。我能找到的最好的是GridLayout,但我希望标签能够自动生成()

转换为
转换为
转换为

转换为

据我所知,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 {

            }
        }
    }
}