Как убрать расстояние между блоками в QGridLayout при Fixed/maximum size виджетов?
Если попытаться ограничить размер виджета, то при spacing = 0 исчезает только горизонтальное пространство, возможно ли убрать и вертикальное используя QGridLayout?
Догадываюсь, что можно этого избежать используя QVBoxLayout/QHBoxLayout, не нашел в примеров именно с QGridLayout:
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
gridbox = QtWidgets.QGridLayout(spacing = 0)
box1 = QtWidgets.QWidget(self)
box2 = QtWidgets.QWidget(self)
boxes = [box1, box2]
for box in boxes:
box.setStyleSheet("background-color: red;")
box.setFixedSize(200, 100)
gridbox.addWidget(box1, 0, 0)
gridbox.addWidget(box2, 0, 1)
widget = QtWidgets.QWidget(self)
mainbox = QtWidgets.QVBoxLayout(widget)
mainbox.addLayout(gridbox)
self.setCentralWidget(widget)
self.setMinimumSize(500, 500)
Ответы (2 шт):
Установить расстояние между элементами в данном лейауте можно так:
grid = QGridLayout() #QGridLayout(spacing = 0) тоже работает
# Установка вертикального и горисонтального расстояния между виджетами
grid.setSpacing(0)
# Установка горизонтального расстояния между виджетами
grid.setHorizontalSpacing(0)
# Установка вертикального расстояния между виджетами
grid.setVerticalSpacing(0)
Пример кода:
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
gridbox = QGridLayout(spacing = 0)
box1 = QWidget(self)
box2 = QWidget(self)
box3 = QWidget(self)
box4 = QWidget(self)
box1.setStyleSheet("background-color: red;")
box2.setStyleSheet("background-color: green;")
box3.setStyleSheet("background-color: yellow;")
box4.setStyleSheet("background-color: blue;")
gridbox.addWidget(box1, 0, 0)
gridbox.addWidget(box2, 0, 1)
gridbox.addWidget(box3, 1, 0)
gridbox.addWidget(box4, 1, 1)
panel = QWidget(self)
panel.setLayout(gridbox)
self.setCentralWidget(panel)
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
sys.exit(app.exec_())
Легче зафиксировать/контролировать размер виджета-панели, на которой все это расположено (в примере это panel), чем просто задавать ограничения в размерах на внутренние виджеты и пытаться контролировать расстояние между ними. Мне кажется, что можно все это комбинировать.
При отсутствии пространства между внутренними виджетами размер виджета-панели является суммой сторон внутренних.
Например:
box1.setFixedSize(200, 100)
box2.setFixedSize(200, 100)
тогда размеры панели:
panel.setFixedSize(QSize(400,200))
QGridLayout::
setColumnStretch(int column, int stretch)Устанавливает коэффициент растяжения (stretch) для столбца (column). Первый столбец - номер 0.
Коэффициент растяжения относительно других столбцов в этой сетке. Столбцы с более высоким коэффициентом растяжения занимают больше доступного пространства.
Коэффициент растяжения по умолчанию равен 0.
import sys
from PyQt5 import QtWidgets
class MyWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
widget = QtWidgets.QWidget()
self.setCentralWidget(widget)
# self.setMinimumSize(500, 500)
self.resize(500, 500)
self.box1 = QtWidgets.QWidget(styleSheet="background-color: red;")
self.box1.setFixedSize(200, 100)
self.box2 = QtWidgets.QWidget(styleSheet="background-color: green;")
self.box2.setFixedSize(200, 100)
gridbox = QtWidgets.QGridLayout(widget, spacing=0)
gridbox.addWidget(self.box1, 1, 1)
gridbox.addWidget(self.box2, 1, 2)
gridbox.setColumnStretch(0, 1)
gridbox.setColumnStretch(3, 1)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
screen = MyWindow()
screen.show()
sys.exit(app.exec_())
