Не создаётся ScrollBar в QScrollArea, PyQt
Помогите, пожалуйста, с решением данной задачи.
Требуется следующее:
По кнопке в главном окне должно открываться второе окно.
Во втором окне должна быть
QScrollAreaс содержимым и Скроллбарами (вертикальным и горизонтальным).
Важно, чтобы второе окно не являлось полностью QScrollArea, а только содержало её внутри себя.
Прикладываю свой код. Подскажите, пожалуйста, как его исправить, чтобы появился скроллбар. Огромное спасибо за ответы!
import sys
from PyQt6.QtCore import QSize
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QScrollArea, QLabel
class Window_303(QWidget):
def __init__(self):
super().__init__()
self.setFixedSize(QSize(500, 500))
scroll_area = QScrollArea(self)
dict_303 = {}
for i in range(0, 50):
dict_303[f'label_number_{i}'] = QLabel(f'Номер {i}', scroll_area)
dict_303[f'label_number_{i}'].move(0, 0 + 16 * i)
dict_303[f'label_number_{i}'].show()
scroll_area.show()
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.w = Window_303()
button = QPushButton("Открыть окно", self)
button.show()
button.clicked.connect(self.show_window_303)
self.show()
def show_window_303(self, checked):
self.w.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = Window()
try:
sys.exit(app.exec())
except:
print("Exiting")
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
Установите свои импорты и попробуйте.
import sys
'''
from PyQt6.QtCore import QSize
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, \
QWidget, QScrollArea, QLabel
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Window_303(QWidget):
def __init__(self):
super().__init__()
# ? self.setFixedSize(QSize(500, 500))
self.resize(QSize(500, 500)) # +
scroll_area = QScrollArea(self) # 1
scroll_area.setGeometry(QtCore.QRect(20, 20, 230, 170)) # 2
scroll_area.setWidgetResizable(True) # 3
self.scrollAreaWidgetContents = QtWidgets.QWidget() # 4
layoutV = QVBoxLayout(self.scrollAreaWidgetContents) # 5
scroll_area.setWidget(self.scrollAreaWidgetContents) # 6
dict_303 = {}
for i in range(0, 50):
# dict_303[f'label_number_{i}'] = QLabel(f'Номер {i}', scroll_area)
dict_303[f'label_number_{i}'] = QLabel(f'Номер {i}') # 7
# dict_303[f'label_number_{i}'].move(0, 0 + 16 * i)
# dict_303[f'label_number_{i}'].show()
# scroll_area.show()
layoutV.addWidget(dict_303[f'label_number_{i}']) # 8
dict_303[f'label_number_{i}'].setText(
dict_303[f'label_number_{i}'].text() +
' Это последняя строка и она длиннее других.')
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QtWidgets.QWidget(self)
self.setCentralWidget(self.centralWidget)
self.w = Window_303()
self.button = QPushButton("Открыть окно", self)
self.button.show()
self.button.clicked.connect(self.show_window_303)
main_layout = QVBoxLayout(self.centralWidget)
main_layout.addWidget(self.button, alignment=Qt.AlignHCenter | Qt.AlignBottom)
# self.show()
def show_window_303(self, checked):
self.w.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = Window()
main_window.resize(200, 500)
main_window.show()
sys.exit(app.exec())
Автор решения: Альберт
→ Ссылка
Для решения задачи изменил в своём коде следующий блок:
class Window_303(QWidget):
def __init__(self, parent=None):
super(Window_303, self).__init__(parent)
self.setFixedSize(600, 600)
scroll_area = QScrollArea(self)
scroll_area.setGeometry(0, 0, 420, 180)
scroll_area.setWidgetResizable(False)
container = QWidget()
scroll_area.setWidget(container)
dict_303 = {}
geometry = QRect(10, 10, 0, 0)
for i in range(0, 50):
dict_303[f'label_number_{i}'] = QLabel(f'Номер {i}', container)
dict_303[f'label_number_{i}'].adjustSize()
dict_303[f'label_number_{i}'].move(geometry.bottomLeft())
geometry |= dict_303[f'label_number_{i}'].geometry()
geometry.setTopLeft(QPoint(0, 0))
container.resize(geometry.size())
