I'm codding an app that open json file and according it content fill interface with grid of squares. Base UI I made in QT Designer and it looks like that.

Everything worked good. And I wanted make improvement, such as adjust width window according to content. And after that UI broke. It doesn't adjust, but even shrinks in width.
In debugging I found out that this because of QScrollArea. If I place grid of squares outside this widget, window adjusts fine. But I can't find/understand why QScrollArea doesn't adjust window size.
This is form_ui.py from Qt Designer:
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_RAL_widget(object):
def setupUi(self, RAL_widget):
RAL_widget.setObjectName("RAL_widget")
RAL_widget.resize(800, 600)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(RAL_widget.sizePolicy().hasHeightForWidth())
RAL_widget.setSizePolicy(sizePolicy)
RAL_widget.setMinimumSize(QtCore.QSize(0, 0))
RAL_widget.setMaximumSize(QtCore.QSize(800, 600))
self.horizontalLayout = QtWidgets.QHBoxLayout(RAL_widget)
self.horizontalLayout.setContentsMargins(-1, -1, 0, -1)
self.horizontalLayout.setObjectName("horizontalLayout")
self.RAL_tab = QtWidgets.QTabWidget(parent=RAL_widget)
self.RAL_tab.setObjectName("RAL_tab")
self.Classic_tab = QtWidgets.QWidget()
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.Classic_tab.sizePolicy().hasHeightForWidth())
self.Classic_tab.setSizePolicy(sizePolicy)
self.Classic_tab.setObjectName("Classic_tab")
self.verticalLayout = QtWidgets.QVBoxLayout(self.Classic_tab)
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetNoConstraint)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.classic_tab_scroll_area = QtWidgets.QScrollArea(parent=self.Classic_tab)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.classic_tab_scroll_area.sizePolicy().hasHeightForWidth())
self.classic_tab_scroll_area.setSizePolicy(sizePolicy)
self.classic_tab_scroll_area.setAutoFillBackground(False)
self.classic_tab_scroll_area.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
self.classic_tab_scroll_area.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.classic_tab_scroll_area.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents)
self.classic_tab_scroll_area.setWidgetResizable(True)
self.classic_tab_scroll_area.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.classic_tab_scroll_area.setObjectName("classic_tab_scroll_area")
self.classic_scroll_widget = QtWidgets.QWidget()
self.classic_scroll_widget.setGeometry(QtCore.QRect(0, 0, 785, 556))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.classic_scroll_widget.sizePolicy().hasHeightForWidth())
self.classic_scroll_widget.setSizePolicy(sizePolicy)
self.classic_scroll_widget.setObjectName("classic_scroll_widget")
self.classic_grid = QtWidgets.QGridLayout(self.classic_scroll_widget)
self.classic_grid.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetNoConstraint)
self.classic_grid.setObjectName("classic_grid")
self.classic_tab_scroll_area.setWidget(self.classic_scroll_widget)
self.verticalLayout.addWidget(self.classic_tab_scroll_area)
self.RAL_tab.addTab(self.Classic_tab, "")
self.horizontalLayout.addWidget(self.RAL_tab)
self.retranslateUi(RAL_widget)
self.RAL_tab.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(RAL_widget)
def retranslateUi(self, RAL_widget):
_translate = QtCore.QCoreApplication.translate
RAL_widget.setWindowTitle(_translate("RAL_widget", "RAL Pallete"))
self.RAL_tab.setTabText(self.RAL_tab.indexOf(self.Classic_tab), _translate("RAL_widget", "Classic"))
And this is my main.py:
import json
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel
from PyQt6.QtCore import Qt
from form_ui import Ui_RAL_widget
class Window(QWidget, Ui_RAL_widget):
def __init__(self):
super().__init__()
self.setupUi(self)
self.show()
self.fill_classic_pallete()
# Adjust window width
self.setFixedSize(self.sizeHint().width(), 600)
# Debugging
print(f"Size Hint: {self.sizeHint()}")
print(f"Actual Size: {self.size()}")
# Fill grid with labels according json data
def fill_classic_pallete(self):
with open("Ral_classic.json", "r", encoding="utf-8-sig") as ral_file:
ral_data = ral_file.read()
ral_classic = json.loads(ral_data)
# Columns number in grid
NUM_COLUMNS = 6
# Create labels
for index, ral in enumerate(ral_classic):
label = QLabel(self.classic_scroll_widget)
label.setObjectName(ral["RAL"].replace(" ", ""))
row = index // NUM_COLUMNS
col = index % NUM_COLUMNS
label.setText(f"{ral['RAL']}\n{ral['English']}")
label.setStyleSheet(f"background-color: {ral['HEX']}")
label.setFixedSize(120, 120)
label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.classic_grid.addWidget(label, row, col)
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
Also here is link to JSON - RAL_classic.json
