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