Как работает setColumnStretch и setRowStretch

#python #python-3.x #pyqt #pyqt5 #qgridlayout

Вопрос:

У меня есть приложение, созданное с использованием 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())
     

    Первый метод указывает, что виджет будет размещен в позиции «строка» и «столбец», которые занимает элемент, а во втором методе может быть указано количество строк или столбцов, которые он занимает, и они эквивалентны:

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

    Таким образом lay.addWidget(widget, 2, 0, 1, 3) , это означает, что «виджет» будет размещен в позиции 2×0 и будет занимать 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 заполнен одними и теми же виджетами, а размер строк и столбцов равен 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

    Что произойдет, если вы установите значение stretch равным 0? Ну, он будет занимать минимальный размер, а те, у кого растяжка > 0, сохранят пропорцию:

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

    введите описание изображения здесь

    Та же концепция применима и к setColumnStretch().

Комментарии:

1. Код и изображения, которые вы предоставляете, помогли мне полностью понять макеты в Qt. Спасибо!