布局管理

布局管理

在没使用布局管理器的情况下setLayout(null),可以通过调用setSize(),setLocation(),setBounds()来修改组件的大小、位置;

总结

在使用了布局管理器的情况下,只能通过调用setPreferredSize()方法来修改组件的大小(长宽)。

布局的计算过程

  • 如果设置了最小尺寸(或者最小尺寸提示)、最大尺寸,则组件获取的空间不能超过这些限制
  • 如果没有设置尺寸限制,则组件会尽可能多的占据空间。如果有多个组件,则空间分配以拉伸因子为标准
  • 如果没有设置拉升因子,则以组件的尺寸策略 QWidget :: sizePolicy()
    和尺寸提示 QWidget :: sizeHint()
    为依据,在有多余空间的情况下,尽可能的占据多的空间。这也是组件的默认尺寸

组件中对布局有影响的函数

一个组件要想影响布局管理,需要使用以下任何或全部机制:

  • 重新实现 QWidget :: sizeHint() 以返回小部件的首选大小。
  • 重新实现 QWidget :: minimumSizeHint()
    以返回小部件可以具有的最小尺寸。
  • 调用 QWidget :: setSizePolicy() 来指定窗口小部件的空间要求。

在上面的任何一个操作之后,都应调用 QWidget :: updateGeometry()
,这将导致布局重新计算。即使多次连续调用 QWidget :: updateGeometry()
也只会进行一次布局重新计算。

如果 Widget
的高度依赖于其宽度(例如,具有自动断字的标签),请在窗口小部件的大小策略中设置
height-for-width 标志,并重新实现 QWidget :: heightForWidth() 函数。

即使实现 QWidget :: heightForWidth() ,提供一个合理的
sizeHint()仍然是一个好主意。

自定义布局管理器

要编写自己的布局类,必须定义以下内容:

  • 一个用于存储被管理组件的数据结构,其中项是 QLayoutItem 类型
    ,一般使用列表。
  • addItem(),如何添加项目到布局。
  • setGeometry(),如何执行布局。
  • sizeHint(),布局的首选大小。
  • itemAt(),如何迭代布局。
  • takeAt(),如何从布局中删除项目。
  • 在大多数情况下,您还将实现 minimumSize()

Qt 布局系统提供了一种简单而强大的方式,可以在 Widget
中自动排列子元素,以确保它们充分利用可用空间。

简介

Qt 包括一组布局管理类,用于描述在应用程序的用户界面中如何布局 Widget。
当可用的空间发生变化时,这些布局会自动定位和调整 Widget
的大小,确保它们一致地排列,并且整个用户界面保持可用。

所有 QWidget 的子类都可以使用布局来管理他们的子元素,
QWidget :: setLayout() 函数将一个 Layout 应用于 Widget,
当以这种方式在 Widget 上设置了一个 Layout 时,Layout 负责以下任务:

  • 子元素的定位。
  • 合理的窗口默尺寸。
  • 合理的的窗口最小尺寸。
  • 调整大小处理
  • 内容变化时自动更新:
    • 字体大小,文本或子元素的其他内容。
    • 隐藏或显示一个 Widget
    • 删除子元素

Qt 的布局类

省略……

水平、竖直、网格以及表格布局

为 Widget 设置布局的最简单方法是使用内置的布局管理器:QHBoxLayout
QVBoxLayoutQGridLayoutQFormLayout ,这些类继承自
QLayoutQLayout 又来自 QObject (而不是 QWidget ),
他们负责一组 Widgets 的几何管理。
要创建更复杂的布局,可以将布局管理器嵌套在一起。

  • QHBoxLayout 从左到右(或从右到左)横向排列出 Widget。

    澳门新葡亰游戏网址 1

    img

  • QVBoxLayout 从上到下在垂直排列 Widget

    澳门新葡亰游戏网址 2

    img

  • QGridLayout 在二维网格中显示 Widget,一个 小部件可以占用多个单元格

    澳门新葡亰游戏网址 3

    img

  • QFormLayout 在以两列描述性的“标签-字段样式” 样式布局 Widget

    澳门新葡亰游戏网址 4

    img

用代码布局 Widget

澳门新葡亰游戏网址,以下代码用一个 QHBoxLayout 管理五个 QPushButton
的几何特征,如上图第一个截图所示:

QWidget *window = new QWidget;

// 创建五个按钮
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

// 创建布局管理器
QHBoxLayout *layout = new QHBoxLayout;

// 将按钮添加到布局中
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

// 设置布局
window->setLayout(layout);

window->show();

除了布局类本身不同之外,QVBoxLayout 的使用方式是相同的。 QGridLayout
的代码有一些不同,因为我们需要指定 Widget 的行和列位置:

QWidget *window = new QWidget;

// 创建五个按钮
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

// 创建布局管理器
QGridLayout *layout = new QGridLayout;

// 将按钮添加到布局中
layout->addWidget(button1, 0, 0);
layout->addWidget(button2, 0, 1);
// 注意:这个按钮占用两个单元
layout->addWidget(button3, 1, 0, 1, 2);
layout->addWidget(button4, 2, 0);
layout->addWidget(button5, 2, 1);

// 设置布局
window->setLayout(layout);

window->show();

第三个 QPushButton 跨越两列,需要为 QGridLayout :: addWidget()
指定第四和第五个参数。

QFormLayout 在每一行上添加两个 Widget ,通常是 QLabelQLineEdit
,用来创建表单。 在同一行添加 QLabelQLineEdit 会将 QLineEdit
设置为 QLabel 的伙伴控件。 以下代码将使用 QFormLayout 在三行上放置
QPushButtons 和相应的 QLineEdit

QWidget *window = new QWidget;

QPushButton *button1 = new QPushButton("One");
QLineEdit *lineEdit1 = new QLineEdit();
QPushButton *button2 = new QPushButton("Two");
QLineEdit *lineEdit2 = new QLineEdit();
QPushButton *button3 = new QPushButton("Three");
QLineEdit *lineEdit3 = new QLineEdit();

// 创建表格布局
QFormLayout *layout = new QFormLayout;

// 一组一组的将按钮和编辑器放到布局中
layout->addRow(button1, lineEdit1);
layout->addRow(button2, lineEdit2);
layout->addRow(button3, lineEdit3);

window->setLayout(layout);
window->show();
网站地图xml地图