Как setColumnStretch и setRowStretch работают в PyQt5 - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть приложение, созданное с использованием 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)? Пожалуйста, объясните мне все это на примерах.

Заранее спасибо ...

1 Ответ

2 голосов
/ 27 апреля 2020

Краткий ответ: Прочитайте документы 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())
    

    Первый метод указывает, что виджет будет помещен в позиции «строка» и «столбец», что 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_())
    

    enter image description here

  • setColumnStretch() и setRowStretch():

    По умолчанию, если QGridLayout заполнен теми же виджетами, а rowSpan и columnSpan равны 1, тогда все виджеты Это будет тот же размер, но много раз вы хотите, чтобы виджет занимал больше места, или размеры пропорциональны. Чтобы понять логи c, я буду использовать следующий код:

    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

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

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

    enter image description here

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

...