Как добавить QScrollArea внутрь QTabWidget?

Не могу заставить QScrollArea, работать внутри QTabWidget. Тест код прикладываю ниже.
Вопрос в том, как вставить QScrollArea, чтобы виджеты расположенные внутри класса Tab_1 не сжимались, а список из виджетов расположенных внутри class Tab_1, можно было cкролить.

Я понимаю, что нужно поместить, часть кода, которую нужно скролить в QTabWidget > setWidget() и с этим нет проблем, если виджет внутри class Tab_1 один, но если их, как тут 3, то не понимаю как их туда запихнуть.

Пробовал закинуть GroupBox в отдельную функцию, которую потом пытался запихнуть в setWidget - не выходит.
Если поможете советом, буду крайне признателен.

from PyQt5.QtWidgets import (QWidget, QApplication, QGroupBox,
                             QHBoxLayout, QVBoxLayout, QTableWidget, QTabWidget)
from PyQt5.QtCore import Qt
 
class window (QWidget):
    def __init__(self):
        super(window, self).__init__()
        self.setMinimumSize(500, 300)
        hbox = QVBoxLayout()
        hbox.addWidget(self._tab())
 
        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        self.setLayout(vbox_ready)
 
    def _tab(self):
        tabWidget = QTabWidget(self)
        tabWidget.setFixedSize(835, 600)
        tabWidget.move(5, 30)
        tabWidget.setTabPosition(QTabWidget.West)
        tabWidget.addTab(Tab_1(), "Тест")
 
        tabWidget.show()
 
class Tab_1(QWidget):
    def __init__(self):
        super().__init__()
 
        vbox_lbl1 = QVBoxLayout()
        vbox_lbl1.addWidget(self.gb_1())
        vbox_lbl1.addWidget(self.gb_2())
        vbox_lbl1.addWidget(self.gb_3())
        hbox_lbl1 = QHBoxLayout()
        hbox_lbl1.addLayout(vbox_lbl1)
        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox_lbl1)
        self.setLayout(vbox_ready)
 
    def gb_1(self):
        gb1 = QGroupBox("Тест", self)
        gb1.setObjectName("testGroupBox")
 
        self.table = QTableWidget()
        self.table.setRowCount(5)
        self.table.setColumnCount(3)
        self.table.setMinimumSize(450, 200)
        self.table.setHorizontalHeaderLabels(["1", "2", "3"])
 
        hbox = QVBoxLayout()
        hbox.addWidget(self.table, alignment=Qt.AlignCenter)
 
        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb1.setLayout(vbox_ready)
 
        return gb1
 
    def gb_2(self):
        gb2 = QGroupBox("Тест_2", self)
        gb2.setObjectName("test_2GroupBox")
 
        self.table2 = QTableWidget()
        self.table2.setRowCount(5)
        self.table2.setColumnCount(3)
        self.table2.setMinimumSize(450, 200)
        self.table2.setHorizontalHeaderLabels(["1", "2", "3"])
 
        hbox = QVBoxLayout()
        hbox.addWidget(self.table2, alignment=Qt.AlignCenter)
 
        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb2.setLayout(vbox_ready)
 
        return gb2
 
    def gb_3(self):
        gb3 = QGroupBox("Тест_3", self)
        gb3.setObjectName("test_3GroupBox")
 
        self.table3 = QTableWidget()
        self.table3.setRowCount(5)
        self.table3.setColumnCount(3)
        self.table3.setMinimumSize(450, 200)
        self.table3.setHorizontalHeaderLabels(["1", "2", "3"])
 
        hbox = QVBoxLayout()
        hbox.addWidget(self.table3, alignment=Qt.AlignCenter)
 
        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb3.setLayout(vbox_ready)
 
        return gb3
 
if __name__ == ("__main__"):
    import sys
    app = QApplication(sys.argv)
    w = window()
    w.show()
    sys.exit(app.exec_())

Update:

Пример того, что пытаюсь получить в основной программе:

Пример основного окна программы


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

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

Как вариант:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
 
 
class Tab_1(QWidget):
    def __init__(self):
        super().__init__()
 
        vbox_lbl1 = QVBoxLayout(self)
        vbox_lbl1.addWidget(self.gb_1())
        vbox_lbl1.addWidget(self.gb_2())
        vbox_lbl1.addWidget(self.gb_3())
        '''
# ???        hbox_lbl1 = QHBoxLayout()
# ???        hbox_lbl1.addLayout(vbox_lbl1)
# ???        vbox_ready = QVBoxLayout()
# ???        vbox_ready.addLayout(hbox_lbl1)
# ???        self.setLayout(vbox_ready)
        '''
 
    def gb_1(self):
        gb1 = QGroupBox("Тест", self)
        gb1.setObjectName("testGroupBox")
 
        self.table = QTableWidget(7, 7)
        self.table.setMinimumSize(450, 200)
        self.table.setHorizontalHeaderLabels(["1", "2", "3"])
 
        layout_v = QVBoxLayout(gb1)                                   # +++ gb1
        layout_v.setContentsMargins(0, 0, 0, 0)                       # +
        layout_v.addWidget(self.table, alignment=Qt.AlignCenter)
 
        '''
# ???        vbox_ready = QVBoxLayout()
# ???        vbox_ready.addLayout(hbox)
# ???        gb1.setLayout(vbox_ready)
        '''
        return gb1
 
    def gb_2(self):
        gb2 = QGroupBox("Тест_2", self)
        gb2.setObjectName("test_2GroupBox")
 
        self.table2 = QTableWidget()
        self.table2.setRowCount(5)
        self.table2.setColumnCount(3)
        self.table2.setMinimumSize(450, 200)
        self.table2.setHorizontalHeaderLabels(["1", "2", "3"])
 
        hbox = QVBoxLayout(gb2)
        hbox.addWidget(self.table2, alignment=Qt.AlignCenter)
        return gb2
 
    def gb_3(self):
        gb3 = QGroupBox("Тест_3", self)
        gb3.setObjectName("test_3GroupBox")
 
        self.table3 = QTableWidget()
        self.table3.setRowCount(5)
        self.table3.setColumnCount(3)
        self.table3.setMinimumSize(450, 200)
        self.table3.setHorizontalHeaderLabels(["1", "2", "3"])
 
        hbox = QVBoxLayout(gb3)
        hbox.addWidget(self.table3, alignment=Qt.AlignCenter)
        return gb3
        
        
class MainWindow(QWidget): 
    def __init__(self):
        super(MainWindow, self).__init__()

        self.scrollArea = QtWidgets.QScrollArea()               # +++
        vbox = QVBoxLayout(self)                                # +++
        vbox.addWidget(self.scrollArea)                         # +++
        self.scrollArea.setWidgetResizable(True)                # +++

        self.tabWidget = QTabWidget(self)
        self.tabWidget.setTabPosition(QTabWidget.West)

        self.tab_1 = Tab_1()
        self.tabWidget.addTab(self.tab_1, "Тест")
        
        self.scrollArea.setWidget(self.tabWidget)               # +++
        
 
if __name__ == ("__main__"):
    import sys
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(700, 300)
    w.show()
    sys.exit(app.exec_())

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

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

→ Ссылка
Автор решения: Djony Cooper

Решение найдено, может кому пригодится:

from PyQt5.QtWidgets import (QWidget, QApplication, QGroupBox, QGridLayout, QScrollArea,
                             QVBoxLayout, QTableWidget, QTabWidget)
from PyQt5.QtCore import Qt


class window(QWidget):
    def __init__(self):
        super(window, self).__init__()
        self.setMinimumSize(500, 300)
        hbox = QVBoxLayout()
        hbox.addWidget(self._tab())

        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        self.setLayout(vbox_ready)


    def _tab(self):
        tabWidget = QTabWidget(self)
        tabWidget.setFixedSize(835, 600)
        tabWidget.move(5, 30)
        tabWidget.setTabPosition(QTabWidget.West)
        tabWidget.addTab(self.scrolliM(), "Тест")
        tabWidget.addTab(Tab_2(), "Еще вкладка")


    def scrolliM(self):
        scroll = QScrollArea(self)
        scroll.setWidget(Tab_1())

        return scroll


class Tab_1(QWidget):
    def __init__(self):
        super().__init__()

        grid = QGridLayout(self)
        grid.addWidget(self.gb_1())
        grid.addWidget(self.gb_2())
        grid.addWidget(self.gb_3())
        self.setLayout(grid)

    def gb_1(self):
        gb1 = QGroupBox("Тест", self)
        gb1.setObjectName("testGroupBox")

        self.table = QTableWidget()
        self.table.setRowCount(5)
        self.table.setColumnCount(3)
        self.table.setMinimumSize(450, 200)
        self.table.setHorizontalHeaderLabels(["1", "2", "3"])

        hbox = QVBoxLayout()
        hbox.addWidget(self.table, alignment=Qt.AlignCenter)

        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb1.setLayout(vbox_ready)

        return gb1

    def gb_2(self):
        gb2 = QGroupBox("Тест_2", self)
        gb2.setObjectName("test_2GroupBox")

        self.table2 = QTableWidget()
        self.table2.setRowCount(5)
        self.table2.setColumnCount(3)
        self.table2.setMinimumSize(450, 200)
        self.table2.setHorizontalHeaderLabels(["1", "2", "3"])

        hbox = QVBoxLayout()
        hbox.addWidget(self.table2, alignment=Qt.AlignCenter)

        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb2.setLayout(vbox_ready)

        return gb2

    def gb_3(self):
        gb3 = QGroupBox("Тест_3", self)
        gb3.setObjectName("test_3GroupBox")

        self.table3 = QTableWidget()
        self.table3.setRowCount(5)
        self.table3.setColumnCount(3)
        self.table3.setMinimumSize(450, 200)
        self.table3.setHorizontalHeaderLabels(["1", "2", "3"])

        hbox = QVBoxLayout()
        hbox.addWidget(self.table3, alignment=Qt.AlignCenter)

        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb3.setLayout(vbox_ready)

        return gb3

class Tab_2(QWidget):
    def __init__(self):
        super().__init__()

        grid = QGridLayout(self)
        grid.addWidget(self.gb_1())
        grid.addWidget(self.gb_2())
        grid.addWidget(self.gb_3())
        self.setLayout(grid)

    def gb_1(self):
        gb1 = QGroupBox("Тест", self)
        gb1.setObjectName("testGroupBox")

        self.table = QTableWidget()
        self.table.setRowCount(5)
        self.table.setColumnCount(3)
        self.table.setMinimumSize(450, 200)
        self.table.setHorizontalHeaderLabels(["1", "2", "3"])

        hbox = QVBoxLayout()
        hbox.addWidget(self.table, alignment=Qt.AlignCenter)

        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb1.setLayout(vbox_ready)

        return gb1

    def gb_2(self):
        gb2 = QGroupBox("Тест_2", self)
        gb2.setObjectName("test_2GroupBox")

        self.table2 = QTableWidget()
        self.table2.setRowCount(5)
        self.table2.setColumnCount(3)
        self.table2.setMinimumSize(450, 200)
        self.table2.setHorizontalHeaderLabels(["1", "2", "3"])

        hbox = QVBoxLayout()
        hbox.addWidget(self.table2, alignment=Qt.AlignCenter)

        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb2.setLayout(vbox_ready)

        return gb2

    def gb_3(self):
        gb3 = QGroupBox("Тест_3", self)
        gb3.setObjectName("test_3GroupBox")

        self.table3 = QTableWidget()
        self.table3.setRowCount(5)
        self.table3.setColumnCount(3)
        self.table3.setMinimumSize(450, 200)
        self.table3.setHorizontalHeaderLabels(["1", "2", "3"])

        hbox = QVBoxLayout()
        hbox.addWidget(self.table3, alignment=Qt.AlignCenter)

        vbox_ready = QVBoxLayout()
        vbox_ready.addLayout(hbox)
        gb3.setLayout(vbox_ready)

        return gb3

if __name__ == ("__main__"):
    import sys

    app = QApplication(sys.argv)
    w = window()
    w.show()
    sys.exit(app.exec_())
→ Ссылка