在Qt Quick中有两套与元素布局相关的类库,一套叫做Item Positioner(定位器),一套叫做Item Layout(布局),之前示例代码中的锚布局就是通过Item的anchors实现的。
定位器包括Row(行定位器)、Column(列定位器)、Grid(表格定位器)、Flow(流式定位器)。
布局管理器包括行布局(RowLayout)、列布局(ColumnLayout)、表格布局(GridLayout)。
定位器
定位器是一种容器元素,专门用来管理界面中的其他元素,与Qt Widgets中的水平布局和垂直布局类似,不过需要注意的是,定位器不会改变它管理的元素的大小,即便用户调整了界面尺寸,它也坚持不干涉孩子们的尺寸,如果你想界面尺寸变化调整孩子们的尺寸时,可以使用Qt Quick中的布局管理器。常用的定位器元素有下列几种:
Row,Column,Grid,Flow
Row
Row类似于Qt中的水平布局,沿着一行安置它的孩子们。
import QtQuick 2.0
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: rootItem;
Text {
id: centerText
text: "A Single Text.";
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
Row {
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
spacing: 4;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
}
使ColorPicker四个Item沿着一行对其,使用锚布局anchors.left和anchors.bottom是为了把Row定位在界面的左下角。
spacing属性是用来指定ColorPicker之间的间距。
Column
column和row类似,只不过是以列的行时呈现
import QtQuick 2.0
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: rootItem;
Text {
id: centerText;
text: "A Single Text.";
anchors.centerIn: parent;
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
Column {
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
spacing: 4;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
}
Grid
grid就是一个网格,可以在网格上放置item,一般情况下,grid会从左到右,从上到下把它的子Item一个个放置到单元格里。可以通过rows和columns设定表格的行数和列数,如果不设置,默认只有四列,而行数则会根据实际的Item数量自动计算,rowSpacing和columnSpacing指定行列间距,单位是像素。
Grid的flow属性描述表格排列方式,Grid.LeftToRight表示从左到右,为默认值,Grid.TopToBottom表示从上到下。
import QtQuick 2.0
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: rootItem;
Text {
id: centerText;
text: "A Single Text.";
anchors.centerIn: parent;
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
Grid {
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
rows: 3;
columns: 3;
rowSpacing: 4;
columnSpacing: 4;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
}
Grid.LeftToRight Grid.TopToBottom
Flow
Flow其实和Grid类似,不同之处是它没有显示的行列数,它会计算item的尺寸,然后与自身尺寸比较,按需折行。Flow也有flow属性,和Gird类似。
import QtQuick 2.0
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: rootItem;
Text {
id: centerText;
text: "A Single Text.";
anchors.horizontalCenter: parent.horizontalCenter;
anchors.top: parent.top;
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
Flow {
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
width: 280;
height: 130;
spacing: 4;
ColorPicker {
width: 80;
height: 20;
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
width: 100;
height: 40;
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
width: 80;
height: 25;
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
width: 35;
height: 35;
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
width: 20;
height: 80;
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
}
定位器嵌套
Qt Quick中的定位器元素是可以嵌套的,比如通过Row和Column的嵌套就能实现Grid的效果。因为Row、Column、Grid、Flow等对象都是从Item继承的,所以在嵌套定位器时完全可以把他们当作普通Item对待。注意看,被定位器管理的元素不要使用x,y和anchors等属性。
import QtQuick 2.0
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: rootItem;
Text {
id: centerText;
text: "A Single Text.";
anchors.centerIn: parent;
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
Row {
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
spacing: 4;
Column {
spacing: 4;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
Column {
spacing: 4;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
Column {
spacing: 4;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
}
}
布局管理器
Qt Quick中的布局管理器和Qt Widgets中的相似,它与定位器的不同之处在于:布局管理器会自动调整子Item的尺寸来适应界面大小的变化。
要使用布局管理器,需要引入Layouts模块:
import QtQuick.Layouts 1.1
GridLayout
GridLayout和Qt中的QGridLayout功能类似,它在一个表格中安排它管理的Item,如果用户调整界面尺寸,GridLayout会自动重新调整Item的位置。
GridLayout所管理的Item,可以使用下列附加属性(这正是布局管理器和定位器关键的不同点):
- Layout.row
- Layout.column
- Layout.rowSpan
- Layout.columnSpan
- Layout.minimumWidth
- Layout.minimumHeight
- Layout.preferredWidth
- Layout.preferredHeight
- Layout.maximumWidth
- Layout.maximumHeight
- Layout.fillWidth
- Layout.fillHeight
- Layout.alignment
import QtQuick 2.0
import QtQuick.Layouts 1.1
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: rootItem;
Text {
id: centerText;
text: "A Single Text.";
anchors.centerIn: parent;
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
GridLayout {
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
width: 350; //可以指定布局的宽度
rows: 3;
columns: 3;
rowSpacing: 4;
columnSpacing: 4;
flow: GridLayout.TopToBottom;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
Layout.columnSpan: 3; //占用三列
Layout.rowSpan: 3; //占用三行
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
Layout.fillWidth: true; //填充所有可用宽度
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1.0);
onColorPicked: setTextColor(clr);
}
}
}
RowLayout
RowLayout可以看作是只有一行的GridLayout,它的行为与Row类似,不同之处在于,它所管理的元素可以使用下列附加属性:
- Layout.minimumWidth
- Layout.minimumHeight
- Layout.preferredWidth
- Layout.preferredHeight
- Layout.maximumWidth
- Layout.maximumHeight
- Layout.fillWidth
- Layout.fillHeight
- Layout.alignment
import QtQuick 2.0
import QtQuick.Layouts 1.1
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: rootItem;
Text {
id: centerText;
text: "A Single Text.";
anchors.centerIn: parent;
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
RowLayout {
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
anchors.right: parent.right;
anchors.rightMargin: 4;
spacing: 3;
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
}
ColorPicker {
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
Layout.fillWidth: true;
}
}
}
最后一个元素设置了Layout.fillWidth属性,填充了所有剩余空间。
ColumnLayout
ColumnLayout可以看作是只有一列的GridLayout,它的行为与Column类似,不同之处在于,它所管理的元素可以使用下列附加属性:
- Layout.minimumWidth
- Layout.minimumHeight
- Layout.preferredWidth
- Layout.preferredHeight
- Layout.maximumWidth
- Layout.maximumHeight
- Layout.fillWidth
- Layout.fillHeight
- Layout.alignment
import QtQuick 2.0
import QtQuick.Layouts 1.1
Rectangle {
width: 360;
height: 240;
color: "#EEEEEE";
id: roorItem;
Text{
id: centerText;
text: "A Single Text.";
anchors.centerIn: parent;
font.pixelSize: 24;
font.bold: true;
}
function setTextColor(clr){
centerText.color = clr;
}
ColumnLayout{
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
anchors.top: parent.top;
anchors.topMargin: 4;
//height: 180;
spacing: 4;
ColorPicker{
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
Layout.fillHeight: true;
}
ColorPicker{
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
}
ColorPicker{
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
}
ColorPicker{
color: Qt.rgba(Math.random(), Math.random(), Math.random());
onColorPicked: setTextColor(clr);
}
}
}