QML中RowLayout和row区别,想实现类似于前端那样的布局方式
QT官方文档中Row继承于item,也就是说item有的,row也都有的
item的属性,
activeFocus : bool
activeFocusOnTab : bool
anchors
anchors.alignWhenCentered : bool
anchors.baseline : AnchorLine
anchors.baselineOffset : real
anchors.bottom : AnchorLine
anchors.bottomMargin : real
anchors.centerIn : Item
anchors.fill : Item
anchors.horizontalCenter : AnchorLine
anchors.horizontalCenterOffset : real
anchors.left : AnchorLine
anchors.leftMargin : real
anchors.margins : real
anchors.right : AnchorLine
anchors.rightMargin : real
anchors.top : AnchorLine
anchors.topMargin : real
anchors.verticalCenter : AnchorLine
anchors.verticalCenterOffset : real
antialiasing : bool
baselineOffset : int
children : list<Item>
childrenRect
childrenRect.height : real
childrenRect.width : real
childrenRect.x : real
childrenRect.y : real
clip : bool
containmentMask : QObject*
data : list<QtObject>
enabled : bool
focus : bool
height : real
implicitHeight : real
implicitWidth : real
layer.effect : Component
layer.enabled : bool
layer.format : enumeration
layer.live : bool
layer.mipmap : bool
layer.samplerName : string
layer.samples : enumeration
layer.smooth : bool
layer.sourceRect : rect
layer.textureMirroring : enumeration
layer.textureSize : size
layer.wrapMode : enumeration
opacity : real
palette : Palette
parent : Item
resources : list<QtObject>
rotation : real
scale : real
smooth : bool
state : string
states : list<State>
transform : list<Transform>
transformOrigin : enumeration
transitions : list<Transition>
visible : bool
visibleChildren : list<Item>
width : real
x : real
y : real
z : real
和前端的比较:
add : Transition
bottomPadding : real
effectiveLayoutDirection : enumeration
layoutDirection : enumeration
leftPadding : real
move : Transition
padding : real
populate : Transition
rightPadding : real
spacing : real
topPadding : real
RowLayout也是继承item,下面是他自己的属性,
// 设置元素尺寸
Layout.minimumWidth // 最小尺寸
Layout.minimumHeight // 最小尺寸
Layout.preferredWidth // 最小尺寸
Layout.preferredHeight // 最小尺寸
Layout.maximumWidth // 最小尺寸
Layout.maximumHeight // 最小尺寸
// 设置元素尺寸
Layout.fillWidth // 去除其他元素后,充满剩余尺寸
Layout.fillHeight // 去除其他元素后,充满剩余尺寸
// 设置对齐方式(对齐文本)
Layout.alignment
Qt::AlignLeft
Qt::AlignHCenter
Qt::AlignRight
Qt::AlignTop
Qt::AlignVCenter
Qt::AlignBottom
Qt::AlignBaseline
// 设置margin
Layout.margins
Layout.leftMargin
Layout.rightMargin
Layout.topMargin
Layout.bottomMargin
// 设置拉伸因子
Layout.horizontalStretchFactor
Layout.verticalStretchFactor
// https://blog.csdn.net/qq_45179361/article/details/130480514(这个里面讲了拉伸因子)
和前端比较,要吐槽的点太多了
RowLayout {
id: layout
anchors.fill: parent
spacing: 0
clip: true
Rectangle {
color: 'teal'
Layout.preferredWidth: 110
Layout.preferredHeight: 110
Layout.rightMargin: 20
Text {
anchors.centerIn: parent
text: parent.width + 'x' + parent.height
}
}
Rectangle {
color: 'plum'
Layout.preferredWidth: 100
Layout.preferredHeight: 100
Text {
anchors.centerIn: parent
text: parent.width + 'x' + parent.height
}
}
RowLayout {
id: layout
anchors.fill: parent
spacing: 0
clip: true
Rectangle {
color: 'teal'
Layout.preferredWidth: 110
Layout.preferredHeight: 110
Layout.rightMargin: 20
Text {
anchors.centerIn: parent
text: parent.width + 'x' + parent.height
}
}
Rectangle {
color: 'plum'
Layout.preferredWidth: 100
Layout.preferredHeight: 100
Layout.alignment:AlignRight
Text {
anchors.centerIn: parent
text: parent.width + 'x' + parent.height
}
}
Rectangle {
height:100
color: 'red'
Layout.fillWidth: true
}
}
}
Rectangle{
Layout.preferredWidth: parent.width*1/10
Layout.fillWidth: true
}
Button{
layout.preferredWidth: 50
}
Rectangle{
Layout.preferredWidth: parent.width*1/10
Layout.fillWidth: true
}
Button{
layout.preferredWidth: 50
}
Rectangle{
Layout.preferredWidth: parent.width*1/10
Layout.fillWidth: true
}
然后中间那个改成2/10,就可以通过这个来设置这些占位的大小了
补充:
ColumnLayout在布局时候,对元素竖向排列都是和前端一样的,但是在水平方向上,他会直接让Rectangle居中,上边的例子也可以看出
但是当里面是这样的时候,image,text,时候他们还是会竖向排列,但是水平方向上就不是水平排列的了,就是靠着左边排列的
// contentItem: ColumnLayout{
// width: parent.width
// height: parent.height
// Layout.alignment: Qt.AlignHCenter
// Image{
// Layout.preferredHeight: 60
// source: "qrc:/images/music"
// Layout.fillWidth:true
// fillMode: Image.PreserveAspectFit
// }
// Text {
// text: qsTr("续加仪")
// Layout.fillWidth: true
// horizontalAlignment: Text.AlignHCenter
// font.pixelSize: 18
// color: "#8573a7ab"
// font.family: window.mFONT_FAMILY
// font.bold: true
// }
// Text {
// text: qsTr("这是我的Cloud Music Player")
// Layout.fillWidth: true
// horizontalAlignment: Text.AlignHCenter
// font.pixelSize: 16
// color: "#8573a7ab"
// font.family: window.mFONT_FAMILY
// font.bold: true
// }
// Text {
// text: qsTr("www.hyz.cool")
// Layout.fillWidth: true
// horizontalAlignment: Text.AlignHCenter
// font.pixelSize: 16
// color: "#8573a7ab"
// font.family: window.mFONT_FAMILY
// font.bold: true
// }
// }
用Rectangle包裹一下是这样
contentItem: ColumnLayout{
anchors.fill: parent
clip: true
spacing: 0
Layout.alignment: Qt.AlignHCenter
// Layout在放置时候都是自动居中的,所以宽度合适,他就自己居中了
Rectangle{
Layout.alignment: Qt.AlignHCenter
clip: true
Layout.preferredHeight: 60
Layout.preferredWidth: 60
color: "red"
Image{
// 可以让里面文字或者内容居中对齐
width: 60
height: 60
source: "qrc:/images/music"
// 宽度自适应
}
}
Rectangle{
color: "red"
clip: true
Layout.preferredHeight: 40
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
Text {
width: parent.width
height: parent.height
text: qsTr("Cloud Music")
font.pixelSize: 16
color: "#8573a7ab"
font.family: window.mFONT_FAMILY
font.bold: true
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
Rectangle{
Layout.fillHeight: true
}
}
感觉布局还是先用Rectangle划分好就行了,就和前端一样用div划分的,
直接在布局中还是不要用text,image这些控件,感觉不是特别可控,写好的样式,可能改一些其他东西,他的布局就路乱了(看视频里面调了好久,然后还不太理解,Rectangle更好理解一些),Rectangle设置背景色比较容易,还是比较容易调整布局的,还是尽量都用Rectangle,在Layout下面
Item QML Type https://doc.qt.io/qt-6/qml-qtquick-item.html
Row QML Type https://doc.qt.io/qt-6/qml-qtquick-row.html
RowLayout QML Type https://doc.qt.io/qt-6/qml-qtquick-layouts-rowlayout.html