当前位置: 代码迷 >> 综合 >> 详解 QT 布局管理界面 图文并茂
  详细解决方案

详解 QT 布局管理界面 图文并茂

热度:3   发布时间:2023-12-28 16:20:04.0

一、效果

 

二、3种方法对比

先入为主的心理现象决定了界面极其重要!Qt 一共有3 种方法用于管理窗体上子窗口部件的布局:绝对位置法、人工布局法和布局管理器法。

1、绝对位置法

这种方法是最原始的拖放窗口部件的方法。它对窗体的各个子窗口部件分配固定的大小和位置,是通过调用基类QWidget 提供的setGeometry()函数来实现的。

绝对位置法有很多缺点:
(1)用户无法改变窗口的大小,当父窗口改变时,子窗口不能做出相应的调整。
(2)如果用户选择的字体太大或者翻译成多国语言,特别是俄语,很多都会显示不全被截断。
(3)对于不同风格的平台,这些窗口部件可能会具有并不合适的尺寸大小。
(4)必须人工计算这些位置和大小。这样做不仅非常枯燥而且极易出错,并且还会让后期的维护工作变得痛苦万分。

很显然,使用这种方式管理GUI 应用程序大大降低了程序员的开发效率,降低了应用程序的质量和适应性。
 
2、人工布局法

这种方法的核心是通过重载QWidget::resizeEvent(QResizeEvent*)函数来使得子窗口的的大小尺寸总是和父窗口的大小成比例,也就在一定程度上减轻了计算量,但是在其中也要通过setGeometry()函数来设置子窗口部件的位置和大小。在程序的规模比较小,并且不需要时常变更设计的情况下,绝对位置法勉强可以胜任。但是它就像前面的绝对位置法一样,仍然需要计算许多手写代码中的常量,尤其是当设计被改变的时候,这种情况更加突出,而且它并没有消除文本会被截断的危险。辅以社会自子窗口部件的大小提示,应该可以规避这种风险,但是这样会使代码变得尤为复杂。

3、布局管理器法

这种方式是使用Qt 设计用户界面、组织管理Qt 窗口部件的最好方法。布局管理器为窗口部件提供了能变化的默认值(sensible default sizes),可以随着窗口部件大小的变化,对子窗口部件的大小和位置做出适当的调整。

 

三、布局管理器法详解

1、介绍

QLayout 类是Qt 的几何管理器的基类,它派生自QObject 类和QLayoutItem 类,是一个抽象基类,必须被派生类所重新实现。它的派生类主要有QBoxLayout, QGridLayout, QFormLayout 以及QStackedLayout。而QBoxLayout又有两个主要的Qt4 子类,QHBoxLayout 和QVBoxLayout

(1)水平布局管理器:QHBoxLayout,按水平方向组织管理控件;
(2)垂直布局管理器:QVBoxLayout,按垂直方向组织管理控件;
(3)网格布局管理器:QGridLayout,按照二维网格组织管理控件;
(4)表单布局管理器:QFormLayout,表单布局管理器主要用作管理界面上的输入窗口部件( input widgets)以及和它们相连的标签窗口部件(labels)。
(5)栈布局管理器:QStackeLayout,类似于栈的方式管理控件,不过Qt设计器不知什么原因没有提供它的布局管理器(我认为开发人员觉得前几种已经能满足几乎所有的布局需要,栈布局使用太过复杂,不如用一个控件代替),提供了一个栈控件(QStackedWidget);在实际应用中使用前三种混合基本都能满足设计需求。

2、注意事项

(1)空白(margin)和间距(spacing)

每种布局都有两个重要的属性,空白和间距。空白指的是整个布局四周距离窗体边缘的距离;间距指的是布局管理器内部各个窗口部件之间的距离。空白属性即margin(),间距属性即spacing(),它们的默认值是有窗体的风格决定的。Qt 的默认风格下,子窗体部件的margin()的值是9 英寸。spacing()的值与margin()相同。如果要设置这两个值可以通过setMargin()和setSpacing()。注意,从Qt4.3 开始,margin()属性已经逐渐不再被Qt4 所推荐,更好的设置空白的方法是使用setContentsMargins()方法,它的原型如下:
void QLayout::setContentsMargins ( int left, int top, int right, int bottom )
其中,left, top, right, 和bottom 表示环绕在布局周围的空白。对于QGridLayout 和QFormLayout,不要使用setSpacing()方法,而是要分别使用setHorizontalSpacing()和setVerticalSpacing()方法来设置水平和垂直方向

(2)大小约束(size constraint)

影响布局方式的另一种方法是设置它的子窗口部件的最大大小、最小大小或固定大小。这些是通过设置sizeConstraint 属性来完成的。该属性值是一个枚举常量,定义了布局的大小约束的模式。表列出了它所有可能的取值,它的默认值是QLayout::SetDefaultConstraint。获取和设置该属性值可以通过QWidget::layout()来获取主窗口部件的布局管理器,然后可以调用QLayout::sizeConstraint()函数来查看当前的设置情况,然后再通过QLayout::setSizeConstraint()函数来设置该布局管理器的sizeConstraint 属性。这两种函数的原型如下:

SizeConstraint sizeConstraint () const
void setSizeConstraint ( SizeConstraint )

其中,SizeConstraint 的取值可以在QLayout类的枚举中得到;
QLayout::SetDefaultConstraint 0 主窗口部件的最小尺寸设置为minimumSize(),除非该窗口部件已经有一个最小尺寸
QLayout::SetFixedSize 3 主窗口部件的尺寸设置为sizeHint(),并且不允许改变该窗口部件的尺寸
QLayout::SetMinimumSize 2 主窗口部件的最小尺寸设置为minimumSize(),并且该窗口部件不能够变得更小
QLayout::SetMaximumSize 4 主窗口部件的最大尺寸设置为maximumSize(),并且该窗口部件不能够变得更大
QLayout::SetMinAndMaxSize 5 主窗口部件的最小尺寸设置为minimumSize(),最大尺寸设置为

(3)大小策略(size policy)

一个窗口部件的大小策略会告诉布局系统应该如何对它进行拉伸或收缩。Qt 为它所有的内置窗口部件都提供了合理的默认大小策略值,但是由于不可能为每一种可能产生的布局都提供唯一的默认值,所以在一个窗体中,开发人员改变它上面的一个或两个窗口部件的大小策略是非常普遍的现象。一个QSizePolicy 既包含一个水平分量也包含一个垂直分量。可以通过QSizePolicy 找到对应的枚举值;

(4)伸缩因子(stretch factor)

 除了大小策略中包含的水平方向和垂直方向两个分量之外, QSizePolicy 类还保存了水平方向和垂直方向的一个伸缩因子。这些伸缩因子可以用来说明在增大窗体时,对不同的子窗口部件应使用的不同放大比例。即需要设置QSizePolicy::horizontalStretch 和QSizePolicy::verticalStretch 的值来实现。默认情况下,被布局管理器组合在一起的窗口部件的伸缩因子是相等的,都为0。

3、总结

当界面元素较为复杂时,应该毫不犹豫的尽量使用网格布局,而不是使用水平和垂直布局的组合或者嵌套的形式,因为在多数情况下,后者往往会使“局势”更加复杂而难以控制。网格布局赋予了界面设计器更大的自由度来排列组合界面元素,而仅仅带来了微小的复杂度开销。当要设计的界面是一种类似于两列和若干行组成的形式时,使用表单布局要比网格布局更为方便些。

 

四、用 Gridlayout 界面实现

1、不同大小的部件按比例随着窗口放大缩小,用Gridlayout 能轻松实现。

(1)UI初始界面

(2)Gridlayout 

(3)horizontalLayout

(4)label

(5)widget

(6)label(栅格布局)

(7)layoutRowstretch(博主1,12)

(8)效果图

 

五、用 Gridlayout 代码实现

Qt 之格栅布局(QGridLayout)

 

参考

1、详解 QT 布局管理界面 图文并茂

2、浅谈qt 布局器

3、Qt 之格栅布局(QGridLayout)

4、Qt两种设置Layout的方式有什么区别

5、Qt 水平布局(QHBoxLayout)???????

  相关解决方案