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_())
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_())
Было установлено, что растяжение первого столбца равно 1 второй равен 2, а третий равен 3, что является отношением размера строк 1: 2: 3
Что произойдет, если вы установите растяжку на 0? Ну, он будет занимать минимальный размер, а те, у кого растяжение> 0, сохранят пропорцию:
glay.setRowStretch(0, 0)
glay.setRowStretch(1, 1)
glay.setRowStretch(2, 2)
Та же концепция применяется к setColumnStretch ().