setColumnStretch 和 setRowStretch 如何工作

Posted

技术标签:

【中文标题】setColumnStretch 和 setRowStretch 如何工作【英文标题】:How does setColumnStretch and setRowStretch works 【发布时间】:2020-08-10 13:25:31 【问题描述】:

我有一个使用PySide2 构建的应用程序,它使用setColumnStretch 进行列拉伸,使用setRowStretch 进行行拉伸。它运作良好,但我无法理解它是如何运作的。我参考了 qt 文档,但它对我没有帮助。我被括号内的两个值困住了。

例如:

glay = QtWidgets.QGridLayout(right_container)
glay.addWidget(lineedit, 0, 0)
glay.addWidget(button2, 0, 2)

glay.addWidget(widget, 2, 0, 1, 3)  

glay.addWidget(button, 4, 0)                                    
glay.addWidget(button1, 4, 2)

glay.setColumnStretch(1, 1)                                     # setColumnStretch
glay.setRowStretch(1, 1)                                        # setRowStretch
glay.setRowStretch(2, 2)                                        # setRowStretch
glay.setRowStretch(3, 1)                                        # setRowStretch

这会产生如下图所示的输出:

但是怎么做呢? glay.addWidget(widget, 2, 0, 1, 3)里面的这四个值是做什么的?请用例子解释我这一切。

【问题讨论】:

【参考方案1】:

简答:阅读 Qt 文档:https://doc.qt.io/qt-5/qgridlayout.html,因为它清晰准确。

长答案:

addWidget():

addWidget 方法是重载的(这个概念在 C++ 中本机存在,但可以在 python 中构建,但默认情况下不存在)这意味着方法(或函数)根据参数具有不同的行为,在这种情况下:

void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())

第一种方法表示widget会被放置在一个item占据的“行”和“列”的位置,第二种方法可以表示它占据的行数或列数,它们是等价的到:

def addWidget(self, row, column, rowSpan = 1, colSpan = 1, alignment = Qt.Alignment()):
    pass 

所以在lay.addWidget(widget, 2, 0, 1, 3) 中,这意味着“小部件”将被放置在 2x0 的位置,并将占据 1 行和 3 列。

import random
import sys

from PyQt5 import QtGui, QtWidgets

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    glay = QtWidgets.QGridLayout(w)
    elements = (
        (0, 0, 1, 1),  # Position: 0x0 1 rowspan 1 colspan
        (1, 0, 1, 1),  # Position: 1x0 1 rowspan 1 colspan
        (0, 1, 2, 1),  # Position: 0x1 2 rowspan 1 colspan
        (2, 0, 1, 2),  # Position: 2x0 1 rowspan 2 colspan
    )
    for i, (row, col, row_span, col_span) in enumerate(elements):
        label = QtWidgets.QLabel("".format(i))
        color = QtGui.QColor(*random.sample(range(255), 3))
        label.setStyleSheet("background-color: ".format(color.name()))
        glay.addWidget(label, row, col, row_span, col_span)
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

setColumnStretch()setRowStretch()

默认情况下,如果 QGridLayout 填充了相同的小部件并且 rowSpan 和 columnSpan 为 1,那么所有小部件的大小将相同,但很多时候您希望小部件占用更多空间,或者大小成比例。为了理解逻辑,我将使用以下代码:

import random
import sys

from PyQt5 import QtGui, QtWidgets

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    glay = QtWidgets.QGridLayout(w)
    for i in range(3):
        for j in range(3):
            label = QtWidgets.QLabel("x".format(i, j))
            color = QtGui.QColor(*random.sample(range(255), 3))
            label.setStyleSheet("background-color: ".format(color.name()))
            glay.addWidget(label, i, j)
    glay.setRowStretch(0, 1)
    glay.setRowStretch(1, 2)
    glay.setRowStretch(2, 3)
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

确定第一列的stretch为1,第二列为2,第三列为3,即行大小的比例为1:2:3

如果将拉伸设置为 0 会发生什么?好吧,它将占据最小尺寸,拉伸> 0的将保持比例:

glay.setRowStretch(0, 0)
glay.setRowStretch(1, 1)
glay.setRowStretch(2, 2)

同样的概念也适用于 setColumnStretch()。

【讨论】:

您提供的代码和图像帮助我完全理解了 Qt 中的布局。谢谢!

以上是关于setColumnStretch 和 setRowStretch 如何工作的主要内容,如果未能解决你的问题,请参考以下文章

【PyQt】网格布局 QGridLayout

QT的GridLayout布局,怎样设置图中的布局样式?

变量中的缺失值

Solr语法

阵列反应性问题

如何获取数据集行的特定版本?