I can run this code:
import sys
from PyQt5.QtWidgets import QApplication, QScrollArea, QWidget, QGridLayout, QVBoxLayout, QLabel
from PyQt5 import QtGui, QtCore
from PyQt5.QtGui import QDrag
class MainWidget(QWidget):
def __init__(self, *args, **kwargs):
super().__init__()
self.setStyleSheet("border: 1px solid black;")
self.layout = QGridLayout(self)
self.resize(600, 400)
# for i in [(0,0) , (0,1) , (1,0) , (1,1)]:
for i in [(0,0)]:
print(str(i))
wig = QWidget()
wig.resize(150,100)
# VBox = QVBoxLayout()
# VBox.addStretch(1)
# VBox.addWidget(label)
# wig.setLayout(VBox)
scroll = QScrollArea(wig)
scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
scrollAreaWidgetContents = QWidget()
# label = QLabel()
# font = self.font()
# font.setPointSize(15)
# label.setFont(font)
# label.setText(str(i)+' ')
# VBox = QVBoxLayout()
# VBox.addWidget(label)
# scrollAreaWidgetContents.setLayout(VBox)
scroll.setWidget(scrollAreaWidgetContents)
self.layout.addWidget(scroll, i[0] , i[1])
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWidget()
sys.exit(app.exec_())
and be able to resize my widget together with the widgets contained in the QGridlayout.
While using PyQt-Designer to write my app (test003.ui
), after converting via pyuic5
I get:
test003.py
:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(658, 538)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(1)
sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
Form.setSizePolicy(sizePolicy)
Form.setSizeIncrement(QtCore.QSize(1, 1))
Form.setStyleSheet("QWidget{background-color: yellow\n"
"}")
self.gridLayoutWidget = QtWidgets.QWidget(Form)
self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 10, 641, 501))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.scrollArea = QtWidgets.QScrollArea(self.gridLayoutWidget)
self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 614, 495))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.scrollAreaWidgetContents_2.sizePolicy().hasHeightForWidth())
self.scrollAreaWidgetContents_2.setSizePolicy(sizePolicy)
self.scrollAreaWidgetContents_2.setStyleSheet("QWidget{background-color: blue}")
self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
self.scrollArea.setWidget(self.scrollAreaWidgetContents_2)
self.gridLayout.addWidget(self.scrollArea, 0, 0, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
and with main code:
import sys
from PyQt5.QtWidgets import QApplication, QScrollArea, QWidget, QGridLayout, QVBoxLayout
from PyQt5 import QtGui
from PyQt5.QtGui import QDrag
# from untitled001 import Ui_Form
# from untitled002 import Ui_Form
# from untitled003b import Ui_Form
# from test001 import Ui_Form # form
# from test002 import Ui_Form #form + grid
from test003 import Ui_Form #form + grid + widget
class MainWidget(QWidget, Ui_Form):
def __init__(self, *args, **kwargs):
super().__init__()
self.setupUi(self)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWidget()
# w.show()
sys.exit(app.exec_())
but I get:
where the blue widget doesn't resize together with main one:
What am I doing wrong? I wasn't able to find any hint in PyQt designer and reading out the test003.py
ui.
found an answer here : pyqt5 : Unable to maximize widgets on Window resize
quote of one of the comments:
You're only setting layouts for the "layout widgets" you're creating, but those widget are not managed by a parent layout, which is what should be set on the central widget. Right click on an empty area outside any other widget, and select the appropriate layout from the "Lay out" submenu. –
here Designer working solution for example of my app:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(704, 500)
Form.setStyleSheet("")
self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout")
self.scrollArea_1 = QtWidgets.QScrollArea(Form)
self.scrollArea_1.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.scrollArea_1.setWidgetResizable(True)
self.scrollArea_1.setObjectName("scrollArea_1")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 667, 484))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.scrollAreaWidgetContents.sizePolicy().hasHeightForWidth())
self.scrollAreaWidgetContents.setSizePolicy(sizePolicy)
self.scrollAreaWidgetContents.setStyleSheet("")
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.widget = QtWidgets.QWidget(self.scrollAreaWidgetContents)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth())
self.widget.setSizePolicy(sizePolicy)
self.widget.setStyleSheet("QWidget{border: 3px solid red}\n"
"\n"
"QWidget{background-color: green}")
self.widget.setObjectName("widget")
self.horizontalLayout_2.addWidget(self.widget)
self.scrollArea_1.setWidget(self.scrollAreaWidgetContents)
self.gridLayout.addWidget(self.scrollArea_1, 1, 1, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
pic: