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)
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,我们可以这样写:
但有时我们会发现,设置好的比例系数并不符合我们的要求,这是因为这个布局的宽度高度太小了,而且布局优先满足宽度高度不小于最小宽度高度,以致于无法满足比例要求.
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)
9.原点设置
- Qt.Corner originCorner (self)
- setOriginCorner (self, Qt.Corner)
10.待续
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)