Как я могу из кода задать размер внутреннему виджету QScrollArea?

Как я могу из кода задать размер внутреннему виджету QScrollArea?

Не самому QScrollArea, а той области, которую он может прокручивать.

Сейчас я располагаю в нём элементы, просто указывая их позицию (даже если она выходит за рамки QScrollArea). Я думал полоса прокрутки появится сама при необходимости, но её нет.
Потом я нагуглил, что можно как-то использовать QScrollArea.resize(), но это только задало размер самой QScrollArea, но не его внутренней области. Полосы прокрутки не появились.

Минимальный пример демонстрирующий проблему:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def __init__(self, parent, position):

        self.frame = QtWidgets.QFrame(parent)
        self.frame.setMinimumSize(QtCore.QSize(50, 50))
        self.frame.setMaximumSize(QtCore.QSize(50, 50))
        self.frame.setStyleSheet("background-color: green;")
        self.frame.setGeometry(QtCore.QRect(position[0], position[1], 50, 50))

        self.frame.show()

app = QtWidgets.QApplication([])

mw = QtWidgets.QScrollArea()

Ui_Form(mw, [0,0])
Ui_Form(mw, [75,0])
Ui_Form(mw, [150,0])

Ui_Form(mw, [0,300])

mw.resize(200, 200)
mw.show()

app.exec()

Можно заметить очередной фрейм за приделами QScrollArea, и если растянуть окошко он там есть, но нет возможности добраться до него при помощи полосы прокрутки.


P.S.

setWidgetResizable(True)

либо не работает, либо я его не правильно использую.


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

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

Попробуйте так:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
#    def __init__(self, parent, position):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(50, 50)
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setMinimumSize(QtCore.QSize(50, 50))
        self.frame.setMaximumSize(QtCore.QSize(50, 50))
        self.frame.setStyleSheet("background-color: green;")


class MyForm(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QtWidgets.QWidget()
        self.centralWidget.setObjectName("centralwidget")
        self.centralWidget.setStyleSheet('#centralwidget {background-color: #f55;}')
        self.setCentralWidget(self.centralWidget)

        self.window = QtWidgets.QWidget()
        self.window.setFixedSize(200, 350)                             # !!!
        self.window.setStyleSheet('background-color: #ff5;')
        
        self.positions = [[0, 0], [75, 0], [150, 0], [0, 300]]
        for position in self.positions:
            form = MyForm(self.window)
            form.move(*position)
        
        self.scrollArea = QtWidgets.QScrollArea() 
        self.scrollArea.setObjectName("scrollArea")
        self.scrollArea.setStyleSheet('#scrollArea {background-color: #55f;}')
        self.scrollArea.setWidget(self.window)
        
        self.vbox = QtWidgets.QVBoxLayout(self.centralWidget)
        self.vbox.setContentsMargins(0, 0, 0, 0) 
        self.vbox.addWidget(self.scrollArea)
        
        
if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(200, 200)
    w.show()
    sys.exit(app.exec_())  

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

→ Ссылка