setColumnStretch和setRowStretch如何在PyQt5中工作

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

我有一个使用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

这将产生输出,如下图所示:image

但是如何? glay.addWidget(widget, 2, 0, 1, 3)中的这四个值有什么作用?请用示例向我解释一下。

提前感谢...

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

简短回答:阅读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)中,这意味着“小部件”将放置在位置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_())
    

    enter image description here

  • [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_())

enter image description here

已确定第一列的长度为1,第二列的长度为2,第三列的长度为3,这是行的大小之比1:2:3

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

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

enter image description here

相同的概念适用于setColumnStretch()。

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