Как добавить 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 шт):
Как вариант:
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_())
Решение найдено, может кому пригодится:
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_())


