Как в менеджере компоновки добавить отступы нужного размера между виджетами?

Я хочу чтобы расстояние было таким же как место где крестик в местах где нарисованы палочки.
Когда я добавляю первый виджет, он появляется в самом вверху, как видно на скриншоте, но когда добавляю второй, он появляется по середине, там где показан примерно 4-5 виджет.

Хочу чтобы они добавлялись сразу после первого, то есть не имели расстояния большого.

from PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QLabel, QVBoxLayout, QHBoxLayout, QFrame, QScrollArea, QSpacerItem, QSizePolicy
import sys
from style import StyleSheet


class SubWidget(QFrame):
    def __init__(self, label_text, button_text, parent_layout) -> None:
        super().__init__()
        self.setObjectName("sub_widget")
        
        self.parent_layout = parent_layout
        self.setFixedSize(320, 45)
        self.label = QLabel(label_text)
        self.button_delete = QPushButton(button_text)
        self.button_delete.clicked.connect(self.delete_widget)
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.label, alignment=Qt.AlignmentFlag.AlignCenter)
        self.layout.addWidget(self.button_delete, alignment=Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignRight)

    def delete_widget(self):
        self.deleteLater()

class MainWindow(QMainWindow):
    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle("MainWindow")
        self.setObjectName("main_window")
        
        
        central_widget = QWidget(self)
        central_widget.setObjectName("central_widget")
        self.setCentralWidget(central_widget)

        self.scroll_area = QScrollArea()
        self.scroll_area.setObjectName("scroll_area")
        self.scroll_area.setWidgetResizable(True)
        self.scroll_widget = QWidget()
        self.scroll_widget.setAutoFillBackground(True)
        self.scroll_widget.setStyleSheet("border-radius: 10px;")
        self.widget_layout = QVBoxLayout(self.scroll_widget)
        self.widget_layout.setContentsMargins(5, 5, 5, 0)
        self.widget_layout.setSpacing(15)
        self.scroll_area.setWidget(self.scroll_widget)

        create_label_btn = QPushButton("Create")
        create_label_btn.clicked.connect(self.create_label)

        self.main_layout = QVBoxLayout(central_widget)   
        self.main_layout.addWidget(self.scroll_area)               
        self.main_layout.addWidget(create_label_btn)
    def create_label(self) -> None:
        new_widget = SubWidget("New Label", "Delete", self.widget_layout)
        
        self.widget_layout.addWidget(new_widget, alignment=Qt.AlignmentFlag.AlignCenter)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    window = MainWindow()
    window.setFixedSize(QSize(350, 500))
    window.show()
    app.exec()

Вот есть данный код, я хочу что бы расстояние между виджетами было таким же как и в самом вверху(где поставил крестик), в добавок нужно что бы виджеты создавались сразу после первого введите сюда описание изображения


Ответы (1 шт):

Автор решения: S. Nick

Как вариант:

'''
from PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QLabel, QVBoxLayout, QHBoxLayout, QFrame, QScrollArea, QSpacerItem, QSizePolicy
'''
import sys
from PyQt5.Qt import *
#? from style import StyleSheet


class SubWidget(QFrame):
    def __init__(self, label_text, button_text, parent_layout) -> None:
        super().__init__()
        self.setObjectName("sub_widget")
        self.parent_layout = parent_layout
        self.setFixedSize(320, 45)

        self.label = QLabel(label_text)
        self.button_delete = QPushButton(button_text)
        self.button_delete.clicked.connect(self.delete_widget)
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(
            self.label, alignment=Qt.AlignmentFlag.AlignCenter)
        self.layout.addWidget(
            self.button_delete, 
            alignment=Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignRight)

    def delete_widget(self):
        self.deleteLater()
        

class MainWindow(QMainWindow):
    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle("MainWindow")
        self.setObjectName("main_window")
    
        central_widget = QWidget(self)
        central_widget.setObjectName("central_widget")
        self.setCentralWidget(central_widget)

        self.scroll_area = QScrollArea()
        self.scroll_area.setObjectName("scroll_area")
        self.scroll_area.setWidgetResizable(True)
        self.scroll_widget = QWidget()
        self.scroll_widget.setAutoFillBackground(True)
        self.scroll_widget.setStyleSheet("border-radius: 10px;")
        self.widget_layout = QVBoxLayout(self.scroll_widget)
        self.widget_layout.setContentsMargins(5, 5, 5, 0)

# +++ ------------------------------> v <-----------------------------
        self.widget_layout.setSpacing(5)                         # 15
        self.widget_layout.insertStretch(999, stretch = 1)       # +++

        self.scroll_area.setWidget(self.scroll_widget)

        create_label_btn = QPushButton("Create")
        create_label_btn.clicked.connect(self.create_label)

        self.main_layout = QVBoxLayout(central_widget)   
        self.main_layout.addWidget(self.scroll_area)               
        self.main_layout.addWidget(create_label_btn)
        
    def create_label(self) -> None:
        new_widget = SubWidget(f"New Label", "Delete", self.widget_layout)
# +++
        count = self.widget_layout.count() - 1                       # +++
# -----------------------> vvvvvvvvvvvv <---------------------------------        
        self.widget_layout.insertWidget(                             # +++
            count,                                                   # +++
            new_widget,                                              # +++
            alignment=Qt.AlignmentFlag.AlignCenter)                  # +++


StyleSheet = """
    #central_widget {            
        background-color: #5d7; 
        border-radius: 20px;  
    }
    #scroll_area {              
        background-color: #5f7;
        border-radius: 10px;  
    }
    #sub_widget {
        border: 2px solid #fff; 
        border-radius: 10px;
        background-color: #abc;  
    }
    QLabel {                        
        background-color: green;    
        color: #fff;
        border-radius: 10px;
    }
    QPushButton {
        background-color: gray;  
        border: none;
        padding: 5px;
        border-radius: 10px;           
    }
"""


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    window = MainWindow()
    window.setFixedSize(QSize(350, 500))
    window.show()
    app.exec()

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка