pyqt4文档阅读(6):QGridLayout

来源:互联网 发布:淘宝怎么联系店家客服 编辑:程序博客网 时间:2024/04/27 17:29

本系列文章长期更新修改.


QGridLayout,网格布局,是Qt里十分常用的布局,下图即为网格布局示意图.



属性:

Methods

  • __init__ (self, QWidget parent)
  • __init__ (self)
  • addItem (self, QLayoutItem item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt.Alignment = 0)
  • addItem (self, QLayoutItem)
  • addLayout (self, QLayout, int row, int column, Qt.Alignment = 0)
  • addLayout (self, QLayout, int row, int column, int rowSpan, int columnSpan, Qt.Alignment = 0)
  • addWidget (self, QWidget w)
  • addWidget (self, QWidget, int row, int column, Qt.Alignment = 0)
  • addWidget (self, QWidget, int row, int column, int rowSpan, int columnSpan, Qt.Alignment = 0)
  • QRect cellRect (self, int row, int column)
  • int columnCount (self)
  • int columnMinimumWidth (self, int column)
  • int columnStretch (self, int column)
  • int count (self)
  • Qt.Orientations expandingDirections (self)
  • (int row, int column, int rowSpan, int columnSpan) getItemPosition (self, int idx)
  • bool hasHeightForWidth (self)
  • int heightForWidth (self, int)
  • int horizontalSpacing (self)
  • invalidate (self)
  • QLayoutItem itemAt (self, int)
  • QLayoutItem itemAtPosition (self, int row, int column)
  • QSize maximumSize (self)
  • int minimumHeightForWidth (self, int)
  • QSize minimumSize (self)
  • Qt.Corner originCorner (self)
  • int rowCount (self)
  • int rowMinimumHeight (self, int row)
  • int rowStretch (self, int row)
  • setColumnMinimumWidth (self, int column, int minSize)
  • setColumnStretch (self, int column, int stretch)
  • setDefaultPositioning (self, int n, Qt.Orientation orient)
  • setGeometry (self, QRect)
  • setHorizontalSpacing (self, int spacing)
  • setOriginCorner (self, Qt.Corner)
  • setRowMinimumHeight (self, int row, int minSize)
  • setRowStretch (self, int row, int stretch)
  • setSpacing (self, int spacing)
  • setVerticalSpacing (self, int spacing)
  • QSize sizeHint (self)
  • int spacing (self)
  • QLayoutItem takeAt (self, int)
  • int verticalSpacing (self)

详细分析:


1.网格系统

QGridLayout是一种网格布局系统,和css里的bootstrap相似,但比它更复杂.

一个网格布局就是一个矩阵,每个格子都可以放一个控件或者一个子布局,也可以一个控件占用多个格子.

QWidget可以通过addLayout来把布局对象设置为它的布局,这个时候布局的父亲会被设置成这个QWidget,因此你也可以在QGridLayout初始化的时候指定父亲,来实现这个.

  • __init__ (self, QWidget parent)
  • __init__ (self)

2.添加控件或布局

QGridLayout提供了7个函数来添加控件或子布局等,共分成了三类.

添加控件一般用addWidget,添加子布局用addLayout,而addItem是一个虚函数,在这里一般不使用.

  • addItem (self, QLayoutItem item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt.Alignment = 0)
  • addItem (self, QLayoutItem)
  • addLayout (self, QLayout, int row, int column, Qt.Alignment = 0)
  • addLayout (self, QLayout, int row, int column, int rowSpan, int columnSpan, Qt.Alignment = 0)
  • addWidget (self, QWidget w)
  • addWidget (self, QWidget, int row, int column, Qt.Alignment = 0)
  • addWidget (self, QWidget, int row, int column, int rowSpan, int columnSpan, Qt.Alignment = 0)
参数里的row和column就是要放到第几行第几列的意思,从零开始.
rowSpan和columnSpan则是这个控件要占多少行多少列,默认就是1行1列.如果它们为-1则表示控件要占据到下边缘和右边缘.
Alignment是控件在格子里的对齐样式.

3.宽度高度

不同列和不同行的宽度高度不一定都是一样的,并且通常是不一样的.

每一列都会有一个最小宽度和比例系数,对应地每一行都会有一个最小高度和比例系数.

QGridLayout通过这两个参数以及这个布局的宽度高度,去计算一个行一个列的实际宽度高度.

  • int columnMinimumWidth (self, int column)
  • int columnStretch (self, int column)
  • int rowMinimumHeight (self, int row)
  • int rowStretch (self, int row)
  • setColumnMinimumWidth (self, int column, int minSize)
  • setRowMinimumHeight (self, int row, int minSize)
  • setRowStretch (self, int row, int stretch)

举一个比例系数的用法例子,假如我们要让第一列和第二列的宽度比例是1:3,我们可以这样写:

setColumnStretch(0, 1)setColumnStretch(1, 3)
第一个参数表明第几列,第二个参数表示比例系数.
但有时我们会发现,设置好的比例系数并不符合我们的要求,这是因为这个布局的宽度高度太小了,而且布局优先满足宽度高度不小于最小宽度高度,以致于无法满足比例要求.
其实比例系数的直译是延伸因子,我的理解是当布局的宽度高度不断扩大时,列行的宽度高度会按照延伸因子的比例去设置,这一点很重要.
如果我们想某两个列的宽度始终一样,那么它们的最小宽度和比例系数也要设置成一样.

4.外边距和控件间距

外边距margin和css里的margin是一个意思,是这个布局的外边距.

控件间距spacing是格子与格子之间的间距,包括了垂直和水平,你也可以单独设置垂直间距和水平间距.

  • int margin (self)
  • setMargin (self, int)
  • int spacing (self)
  • setSpacing (self, int spacing)
  • int horizontalSpacing (self)
  • setHorizontalSpacing (self, int spacing)
  • int verticalSpacing (self)
  • setVerticalSpacing (self, int spacing)

当垂直间距和水平间距不相等时,spacing()返回-1.

5.尺寸获取

由于QGridLayout里的每行每列都有一个最小宽度高度,加上外边距和控件间距,QGridLayout会得出一个最小的尺寸minimumSize.

相对地,QGridLayout有一个最大尺寸,宽度是一个很大的数字,但高度和最小值一样,含义未知,貌似也很难用到.

还有一个尺寸可以得到,就是每个格子的尺寸,注意这个函数要在布局尺寸真正确定下来的时候才会得到有效值(相当于要show了之后)

  • QSize maximumSize (self)
  • QSize minimumSize (self)
  • QRect cellRect (self, int row, int column)

cellRect返回的是一个QRect,也就说说它不仅返回尺寸,还返回格子左上角的坐标.

6.控件参数

可以通过下面函数获取添加控件时的4个参数:

  • (int row, int column, int rowSpan, int columnSpan) getItemPosition (self, int idx)

idx是下标的意思,这个下标是根据添加控件先后顺序计算的,并且从零开始.

7.数值获取

有三个比较常用的数值,布局里有多少个控件,有多少行,有多少列.

  • int count (self)
  • int columnCount (self)
  • int rowCount (self)

8.宽度高度纠缠*

有些场合我们的高度是根据宽度计算的,这时候下面的函数就有需要了.

但QGridLayout没有宽度高度纠缠,因此我们要实现宽度高度纠缠的时候,需要继承QGridLayout,然后重新实现这些函数.

  • bool hasHeightForWidth (self)
  • int heightForWidth (self, int)
  • int minimumHeightForWidth (self, int)
第一个函数表明是否有设置宽度高度纠缠,后两个函数的参数的int就是宽度,返回值则是(推荐)高度和最小高度,没有设置纠缠的时候这两个函数应该返回-1.
暂时不清楚Qt会怎么调用这些函数来工作.

9.原点设置

QGridLayout可以设置原点(0,0)的位置,默认是Qt.TopLeftCorner,就是左上角.如设置在右下角的话,x轴和y轴的方向就相反了.
  • Qt.Corner originCorner (self)
  • setOriginCorner (self, Qt.Corner)

10.待续

Qt.Orientations expandingDirections (self)
invalidate (self)
QLayoutItem itemAt (self, int)
QLayoutItem itemAtPosition (self, int row, int column)
setDefaultPositioning (self, int n, Qt.Orientation orient)
setGeometry (self, QRect)
QLayoutItem takeAt (self, int)

0 0