Как задать минимальную и максимальную величины отступов от стенок контейнера?
Мой код заполняет виджетами цветной контейнер box. В него попадают следующие элементы:
picture- некоторое изображение с закругленными краями. Я получаю его с помощью классаLabel- Два виджета
QLabel-label1иlabel2 - Проста кнопка
btn
Эти виджеты не выполняют прямых функций. Они нужны, чтобы можно было понять, как контейнер box располагает внутри себя элементы.
Окно приложения выглядит так:
Сейчас меня не устраивает местоположение виджетов в box. Когда окно достигает достаточно больших размеров, элементы picture и btn находятся слишком близко к верхней и нижней границам контейнера соответственно.
Мне нужно как-то контролировать расстояние между элементами и границами, которые на схеме я назвал H1 и H2:
Я решил, что было бы здорово задать минимальную и максимальную величины отступов от стенок контейнера. Изначально величина этих оступов принимает минимальное значение, но, когда появляется больше места, она постепенно растет до максимального значения:
Возможно, моя проблема решается другим способом, но я не могу придумать ничего лучше. Пожалуйста, подскажите, как навести порядок в контейнере?
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class Label(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
def __init__(self, picture, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
self.setMaximumSize(150, 150)
self.setMinimumSize(150, 150)
self.radius = 10
self.setPicture(picture)
def setPicture(self, picture):
target = QtGui.QPixmap(self.size())
target.fill(QtCore.Qt.transparent)
p = QtGui.QPixmap(picture).scaled(
150, 150, QtCore.Qt.KeepAspectRatioByExpanding,
QtCore.Qt.SmoothTransformation
)
painter = QtGui.QPainter(target)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)
path = QtGui.QPainterPath()
path.addRoundedRect(0, 0, self.width(), self.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.setPixmap(target)
painter.end()
target = None
def mouseReleaseEvent(self, event):
self.clicked.emit()
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.index = 1
main_box = QtWidgets.QVBoxLayout(self)
container = QtWidgets.QWidget()
container.setStyleSheet('background: #7189DB;')
container.setFixedWidth(250)
container.setMinimumHeight(150)
main_box.addWidget(container)
box = QtWidgets.QVBoxLayout(container) # КОНТЕЙНЕР 'BOX'
picture = Label('picture1')
box.addWidget(picture, alignment=QtCore.Qt.AlignCenter)
label1 = QtWidgets.QLabel('Text 1')
box.addWidget(label1, alignment=QtCore.Qt.AlignCenter)
label2 = QtWidgets.QLabel('Text 2')
box.addWidget(label2, alignment=QtCore.Qt.AlignCenter)
btn = QtWidgets.QPushButton('Button')
box.addWidget(btn, alignment=QtCore.Qt.AlignCenter)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Как вариант
QBoxLayout::addStretch(int stretch = 0)
Добавляет растягиваемое пространство (QSpacerItem) с нулевым минимальным размером и коэффициентом растяжения растягивания до конца этого макета блока.
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class Label(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
def __init__(self, picture, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
self.setMaximumSize(150, 150)
self.setMinimumSize(150, 150)
self.radius = 10
self.setPicture(picture)
def setPicture(self, picture):
target = QtGui.QPixmap(self.size())
target.fill(QtCore.Qt.transparent)
p = QtGui.QPixmap(picture).scaled(
150, 150, QtCore.Qt.KeepAspectRatioByExpanding,
QtCore.Qt.SmoothTransformation
)
painter = QtGui.QPainter(target)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)
path = QtGui.QPainterPath()
path.addRoundedRect(0, 0, self.width(), self.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.setPixmap(target)
painter.end()
target = None
def mouseReleaseEvent(self, event):
self.clicked.emit()
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.index = 1
main_box = QtWidgets.QVBoxLayout(self)
container = QtWidgets.QWidget()
container.setStyleSheet('background: #7189DB;')
container.setFixedWidth(250)
# container.setMinimumHeight(150)
container.setMinimumHeight(282) # +++
main_box.addWidget(container)
box = QtWidgets.QVBoxLayout(container) # КОНТЕЙНЕР 'BOX'
picture = Label('im.png')
box.addStretch(1) # +++
box.addWidget(picture, alignment=QtCore.Qt.AlignCenter)
label1 = QtWidgets.QLabel('Text 1')
box.addStretch(1) # +++
box.addWidget(label1, alignment=QtCore.Qt.AlignCenter)
label2 = QtWidgets.QLabel('Text 2')
box.addStretch(1) # +++
box.addWidget(label2, alignment=QtCore.Qt.AlignCenter)
btn = QtWidgets.QPushButton('Button')
box.addStretch(1) # +++
box.addWidget(btn, alignment=QtCore.Qt.AlignCenter)
box.addStretch(1) # +++
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())



