1、 详解 QT 布局管理界面栅格布局管理器可以以网格的形式,将它所管理的部件以一定的矩阵形式排列。比如上图中,所有的部件一起看,其实就是一种矩阵的形式来排列的。栅格布局管理器最典型的用法是将部件规规矩矩的排列好,每个栅格的单元格里放一个部件,如下图的示例:类似上图这种布局比较容易实现,只需要把各个部件填入到指定的单元格里即可,示例代码如下: m_Layout-addWidget(Label1, 0, 0); / 将 Label1填到(0,0 )单元格 m_Layout-addWidget(Label2, 0, 2); / 将 Label2填到(0,2 )单元格 而我们要实现的这个温度转换器的界面
2、,并不是一个规则的栅格结构。而是如下这种结构:上图中的这6部分,并不是规规矩矩的栅格形式。那怎么办呢?没关系,栅格布局管理器提供了很大的灵活性。具体表现在,可以设定某个部件是否需要横跨 n 个列,或者是否需要纵越 m 个行。什么意思呢?先来看一个简单的例子以上面这种布局来说,三个部件其中有两个部件是比较规矩的处于两个单元格内,但是第三个部件就横跨了两列,实际上,我们可以这样来看这张布局图:这样就一目了然了。第三个部件的确是横跨了两列(在水平方向上占用了两个单元格) 。在使用栅格布局管理器对三个部件进行管理时,就可以这样: m_Layout-addWidget(m_Widget1, 0, 0);
3、 / 第一个部件在(0,0) m_Layout-addWidget(m_Widget2, 0, 1); / 第二个部件在(0,1) m_Layout-addWIdget(m_Widget3, 1, 0, 1,2); / 第三个部件起始于(1,0) ,并纵越1 行,横跨2列 同样的,再看下图:我们可以认为右侧的部件纵越了两行(在垂直方向上占用了两个单元格) ,对应的示例代码: m_Layout-addWidget(m_Widget1, 0, 0); / 第一个部件在(0,0) m_Layout-addWidget(m_Widget2, 1, 0); / 第二个部件在(1,0) m_Layout-
4、addWIdget(m_Widget3, 0, 1, 2, 1); / 第三个部件起始于(0,1) ,并纵越2 行,横跨1列 这其实很类似于 HTML 里利用 Table 做网页布局时使用的手段。稍微了解一些 HTML的人都会知道,在 Table 布局时,单元格会有 rowSpan 和 colSpan 的参数,这两个参数的意义其实就是所谓的“纵越 n 个行”和“ 横跨 m 个列”。这里,栅格布局管理器的布局方式,跟它完全一致。OK,回头再看看我们需要实现的界面。我们现在有了 rowSpan 和 colSpan 的概念,那么,我们可以把那张界面布局图变换一下:我们把交叉的这些线全部延伸开,可以看
5、到,整个界面被拆分成了34个单元格,此时,我们就会惊呼,哈哈,这不就是规规矩矩的栅格了吗(虽然它的每个单元格不是一样大,但是没关系,至少行和列都是规矩的了) 。OK,那就开始我们的界面布局吧。为了方便观察,我在每个单元格里标注上他们的编号:首先看 Quit 按钮,它起始于( 0,0) ,横跨3个单元格,也就是 colSpan=3,所以: m_Layout-addWidget(m_QuitButton, 0, 0, 1, 3); 然后是“Centigrade”,这个 Label 起始于(1,0) ,横跨2个单元格,也就是colSpan=2,所以: m_Layout-addWidget(m_Cen
6、Label, 1, 0, 1, 2); 然后是“Fahrenheit”,这个 Label 起始于(1,2) ,它刚好占用1个单元格,所以没有rowSpan 和 colSpan(或者说 rowSpan 和 colSpan 都是1) ,所以: m_Layout-addWidget(m_FahLabel, 1, 2); 再然后是“0”这个 Label,它起始于(2,0) ,纵越2个单元格,rowSpan=2,所以: m_Layout-addWidget(m_Label, 2, 0, 2, 1); 再然后是 Slider,它起始于(2,1) ,纵越2个单元格,rowSpan=2,所以: m_Layou
7、t-addWidget(m_Slider, 2, 1, 2, 1); 再然后是 LCDNumber,它起始于(2,2) ,占用一个单元格,所以: m_Layout-addWidget(m_LCDNumber, 2, 2); 最后是 Dial 表盘,它起始于(3,2)占用一个单元格,所以: m_Layout-addWidget(m_LCDNumber, 3, 2); OK,至此,我们的整个界面布局就完成了,鼓掌 :-)跟使用水平布局管理器和垂直布局管理器的组合方式相比,使用栅格布局管理器只需要消耗一个布局管理器即可完成整个界面的布局。但是这种方式的一个最大的缺点是,需要事先精确设计好每个部件的位置和占用尺寸,在部件数量比较大的情况下,仅仅使用栅格布局管理器就显得力不从心了。所以,在做界面布局的时候,可以使用栅格布局管理器做整体框架设计,然后在其中填充一些水平或垂直布局管理器,或者他们的组合,以便来达到更好的效果。这就好像,在做网页的时候,可以利用 Table 里套用 Table 的方法,来实现一些比较复杂的网页布局控制。