setColumnStretch 和 setRowStretch 如何工作?

问题描述 投票:0回答:1

我有一个使用

PySide2
构建的应用程序,它使用
setColumnStretch
进行列拉伸,使用
setRowStretch
进行行拉伸。它工作得很好,但我无法理解它是如何工作的。我被困在括号内的两个值上。

例如:

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)
里面的这四个值有什么作用?请用例子向我解释这一切。

python python-3.x pyqt pyqt5 qgridlayout
1个回答
28
投票

简短回答:阅读 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())
    

    第一种方法表示该小部件将被放置在某个项目占据的“行”和“列”位置,而第二种方法则可以指示它占据的行数或列数,它们相当于:

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

    所以在

    lay.addWidget(widget, 2, 0, 1, 3)
    中,这意味着“widget”将被放置在位置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_())
    

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.