Pyside6 布局管理器(3)--- QGridLayout的使用

一、QGridLayout的介绍(官翻)

QGridLayout 获得可用的空间(由其父布局或 parentWidget() 提供),将其划分为行和列,并将其管理的每个小部件放入正确的单元格中。

列和行的行为是相同的;我们将讨论列,但行也有等效的功能。

每列都有最小宽度和拉伸系数。最小宽度是使用 setColumnMinimumWidth() 设置的宽度和该列中每个小部件的最小宽度中的最大值。拉伸因子使用setColumnStretch()设置,并确定列将获得多少可用空间,超过其必要的最小值。

通常,每个托管控件或布局都使用 addWidget() 放入自己的单元格中。通过使用 addItem() 和 addWidget() 的行和列跨度重载,小部件也可以占用多个单元格。如果你这样做,QGridLayout会猜测如何在列/行上分配大小(基于拉伸因子)。

要从布局中删除小部件,请调用 removeWidget() 。在 widget 上调用 hide() 也会有效地从布局中删除该 widget,直到调用 show()。

此图显示了具有五列三行网格的对话框的一部分(网格以洋红色显示):

此对话框片段中的第0、2和4列由一个QLabel、一个QLineEdit和一个QListBox组成。第1列和第3列是用setColumnMinimumWidth() 制作的占位符。第0行由三个QLabel对象组成,第1行由三个QLineEdit对象组成,第2行由三个QListBox对象组成。我们使用占位符列(1和3)来获得列之间的正确空间量。

请注意,列和行的宽度或高度并不相等。如果你想让两列具有相同的宽度,你必须自己将它们的最小宽度和拉伸系数设置为相同。可以使用 setColumnMinimumWidth() 和 setColumnStretch() 来执行此操作。

如果 QGridLayout 不是顶级布局(即不管理所有窗口小部件的区域和子窗口小部件),则必须在创建它时,但在对其进行任何操作之前,将其添加到其父布局中。添加布局的正常方法是在父布局上调用 addLayout()。

添加布局后,您可以使用 addWidget()、 addItem() 和 addLayout() 将小部件和其他布局放入网格布局的单元格中。

QGridLayout还包括两个边距宽度:内容边距和间距()。内容边距是沿 QGridLayout 四边预留空间的宽度。间距()是相邻方框之间自动分配的间距的宽度。

默认的内容边距值由样式提供。Qt样式指定的默认值是子控件为9,窗口为11。间距默认值与顶级布局的边距宽度相同,或与父布局相同。。

二、QGridLayout的相关方法

1.QGridLayout的创建及基本使用

|---------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|------|---------------|
| API函数 | 参数说明 | 返回值 | 功能作用 |
| QGridLayout(self,parent) | parent:QWidget | None | 创建网格布局实例 |
| addWidget(self,w,row,column, rowspan=None,columnspan=None, alignment=Deafult(Qt.Alignment)) | w:QWidget row:int column:int rowspan:int column:int alignmen:Qt.Alignmen | None | 按照行列索引位置添加控件 |
| addLayout(self,l,row,column, rowspan=None,columnspan=None, alignment=Deafult(Qt.Alignment)) | w:l row:int column:int rowspan:int column:int alignmen:Qt.Alignmen | None | 按照行列索引位置添加子布局 |

行、列的索引均从0开始,最上面一行为第0行,而非第1行;最左侧一列为第0列,而非第1列。

rowspan和columnspan两个参数的意义是,加入的这个控件所占位置跨几行或几列。比如下例中的日历控件,其columnspan=2,即其站一行两列的位置。好比我们在excel中将一行的两个列单元格合并形成的控件分配给日历控件。

Alignment参数针对控件内容的对齐方式,通常不做设置。

example:

python 复制代码
from PySide6.QtWidgets import QWidget,QApplication,QGridLayout,QPushButton,
QLabel,QLineEdit,QCalendarWidget
from PySide6.QtCore import Qt
import sys

class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()
        # 创建一个网格布局
        lay = QGridLayout(self)

        # 创建2各标签、2个单行文本框、2个按钮和1个日历控件
        lab1 = QLabel("账号:")
        lab2 = QLabel("密码:")
        line1 = QLineEdit()
        line2 = QLineEdit()
        calendar_1 = QCalendarWidget()
        btn1 = QPushButton("确定")
        btn2 = QPushButton("取消")

        # 将控件通过索引放置相应位置中
        lay.addWidget(lab1, 0, 0, Qt.AlignmentFlag.AlignRight)
        lay.addWidget(line1, 0, 1)
        lay.addWidget(lab2, 1, 0, Qt.AlignmentFlag.AlignRight)
        lay.addWidget(line2, 1, 1)
        lay.addWidget(btn1, 2, 0)
        lay.addWidget(btn2, 2, 1)
        lay.addWidget(calendar_1,3,0,1,2)
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec())

运行结果:

2.QGridLayout的其他相关方法

|----------------------------------------------------|---------------------------------------------------------------|------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
| API函数 | 参数说明 | 返回值 | 功能作用 |
| setGeometry(self, arg__1) | arg_1:QRect | None | 设置网格布局大小 |
| setRowMinimumHeight(self, row, minSize) | row:int minSize:int | None | 设置索引行的最小行高 |
| rowMinimumHeight(self, row) | row:int | int | 获取索引行的最小行高 |
| setColumnMinimumWidth(self, column, minSize) | column:int minSize:int | None | 设置索引行的最小行高 |
| columnMinimumWidth(self, column) | column:int | int | 获取索引行的最小行高 |
| setContentsMargins(self, left, top, right, bottom) | left:int top:int ringhtLint bottom:int | None | 设置布局的内容边距(参数为左上右下的尺寸) |
| setContentsMargins(self, margins) | margins:QMargin | None | 设置布局的内容编剧(参数为QMargin对象) |
| getContentsMargins(self): | None | tupe(left,top, right,bottom) | 以元组形式返回布局内容边距的四边值 |
| contentsMargins(self) | None | QMargin | 获取一个布局的内容边距 |
| unsetContentsMargins(self) | None | None | 取消设置布局周围的任何用户定义的边距。布局将使用样式提供的默认值。 |
| setsapcing(self,spacing) | spacing:int | None | 设置布局控件间的空白间距(水平及垂直) |
| spacing(self) | None | spacing:int | 获取布局控件间的空白间距(水平及垂直) |
| setHorizontalSpacing(self, spacing) | spacing:int | None | 设置布局控件间的水平空白间距(列间距) |
| setVerticalSpacing(self, spacing) | spacing:int | None | 设置布局控件间的垂直空白间距(行间距) |
| setRowStretch(self, row, stretch) | row:int stretch:int | None | 设置索引行的伸缩因子 |
| rowStretch(self, row) | row:int | stretch:int | 获取索引行的伸缩因子 |
| setColumnStretch(self, column, stretch) | column:int stretch:int | None | 设置索引列的伸缩因子 |
| columnStretch(self, column) | column:int | stretch:int | 获取索引列的伸缩因子 |
| cellRect(self, row, column) | row:int column:int | QRect | 返回索引位置的单元格矩形 |
| count(self) | None | int | 获取布局内控件数量 |
| rowCount(self) | None | Int | 获取布局行数 |
| columnCount(self) | None | Int | 获取布局列数 |
| getItemPosition(self, idx) | idx:int | tuple(row:int column:int rowspan:int columnspan:int) | 通过条目索引获取该位置的信息,返回值是一个包含行、列、跨行数、跨列数的元组 |
| itemAtPosition(self, row, column) | row:int column:int | QLayoutItem | 返回索引位置的条目对象 |
| removeWidget(self,w) | w:QWidget | None | 移除布局的子控件w |
| replaceWidget(from,to,option) | from:QWidget to:QWidget option: Qt.FindChildOption option为枚举类 | QLayoutItem | 搜索小部件from并将其替换为小部件to。成功时返回包含小部件的布局项。否则返回None。 返回的布局项不再属于该布局,应该删除或插入到另一个布局中。小部件from不再由布局管理,可能需要删除或隐藏。widget from的父类保持不变。 此函数适用于内置Qt布局,但可能不适用于自定义布局。 |
| setOriginCorner(self, arg__1) | arg_1:Qt.Corner Qt枚举类 | None | 设置布局矩形的原点角 |
| originCorner(self) | None | Qt.Corner | 获取布局矩形的原点角 |

这些方法中尺寸因子和空白的设置在上节中已经详细的进行了解释。其他的相关方法在表中功能作用栏基本已经说明,这里不再讲解。

相关推荐
芝麻团坚果5 分钟前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
EterNity_TiMe_14 分钟前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析
Stara051122 分钟前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
zongzi_49426 分钟前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript
kikyo哎哟喂37 分钟前
Java 代理模式详解
java·开发语言·代理模式
duration~42 分钟前
SpringAOP模拟实现
java·开发语言
一条晒干的咸魚1 小时前
【Web前端】实现基于 Promise 的 API:alarm API
开发语言·前端·javascript·api·promise
hence..1 小时前
Vscode写markdown快速插入python代码
ide·vscode·python
就爱六点起1 小时前
C/C++ 中的类型转换方式
c语言·开发语言·c++
我明天再来学Web渗透1 小时前
【SQL50】day 2
开发语言·数据结构·leetcode·面试