#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. Спасибо!