Adjust window size according content in QScrollArea in PyQt6

71 Views Asked by At

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. enter image description here

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.

enter image description here

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

0

There are 0 best solutions below