Зависимость размеров виджетов от изменения размеров окна

Как сделать так, чтобы в зависимости от растягивания или уменьшения окна все остальное также меняло размер?

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout
from PyQt5.QtCore import QSize


class Window(QMainWindow):  # Создаем класс Window, который наследует все от класса QMainWindow
    def __init__(self):  # Создаем конструктор
        super(Window, self).__init__()  # С помощью функции super вызывем конструктор из родительского класса

        self.setGeometry(700, 200, 450, 650)  # Выбираем отступы, ширу и высоту окна
        self.setWindowTitle('КБЖУ')  # Указываем название приложения
        # self.setFixedSize(QSize(450, 650))  # Устанавливаем фиксированный размер главного окна


        self.heading = QtWidgets.QLabel(self)  # Создаем заголовок приложения
        self.heading.setText('')  # Текст в этом заголовке
        self.heading.setStyleSheet('background-color: rgb(68, 207, 203);')  # Фон заголовка
        self.heading.setGeometry(0, 0, 450, 90)  # Отступы, ширина и высота заголовка

# Функция которая создает приложение
def aplication():
    app = QApplication(sys.argv)  # создаем объект в качестве параметра предаём информацию о системе

    window = Window()  # Создаем объект(Окно  приложения) на основе нашего класса Window

    window.show()  # Метод show показывает созданное окно
    sys.exit(app.exec_())  # Корректное закрытие приложения

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

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

Как вариант

import sys
from PyQt5.Qt import *

class Window(QLabel):
    def __init__(self):  
        super(Window, self).__init__()  
      
        self.setStyleSheet('background-color: rgb(68, 207, 203);')
        self.setText("Hello World")        
        
    def paintEvent(self, event):
        doc = QTextDocument()
        if self.textFormat() == Qt.RichText or \
            self.textFormat() == Qt.AutoText and \
            Qt.mightBeRichText(self.text()):
            
            doc.setHtml(self.text())
        else:
            doc.setPlainText(self.text())
            
        frame = doc.rootFrame().frameFormat()
        frame.setMargin(0)
        doc.rootFrame().setFrameFormat(frame)
        scale = min(
            self.width() / doc.size().width(), 
            self.height() / doc.size().height()
        )
        qp = QPainter(self)
        qp.scale(scale, scale)
        doc.drawContents(qp, QRectF(self.rect()))


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

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


Update

import sys
from PyQt5.Qt import *

class Label(QLabel):
    def __init__(self):  
        super(Label, self).__init__()  
      
        self.setStyleSheet('background-color: rgb(68, 207, 203);')
        self.setText("Hello World") 
        
        
    def paintEvent(self, event):
        doc = QTextDocument()
        if self.textFormat() == Qt.RichText or \
            self.textFormat() == Qt.AutoText and \
            Qt.mightBeRichText(self.text()):
            
            doc.setHtml(self.text())
        else:
            doc.setPlainText(self.text())
            
        frame = doc.rootFrame().frameFormat()
        frame.setMargin(0)
        doc.rootFrame().setFrameFormat(frame)
        scale = min(
            self.width() / doc.size().width(), 
            self.height() / doc.size().height()
        )
        qp = QPainter(self)
        qp.scale(scale, scale)
        doc.drawContents(qp, QRectF(self.rect()))


class Window(QMainWindow):  
    def __init__(self):  
        super().__init__() 
        
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)        
        
        self.label = Label()
        self.textEdit = QTextEdit()
        self.button = QPushButton('Button')
        
        main_layout = QVBoxLayout(self.centralWidget)
        main_layout.addWidget(self.label, 1)
        main_layout.addWidget(self.textEdit, 4)
        main_layout.addWidget(self.button, 0)
        
        

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Window()
    w.resize(450, 450)
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка
Автор решения: gil9red

Используйте компоновщики Q*Layout (типа QVBoxLayout). Для QMainWindow нужно создать виджет для setCentralWidget и на него размещать виджеты

В качестве примера покажу использование QVBoxLayout и QHBoxLayout

Пример:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QHBoxLayout, QVBoxLayout, QPushButton, QTextEdit


class Window(QMainWindow):  # Создаем класс Window, который наследует все от класса QMainWindow
    def __init__(self):  # Создаем конструктор
        super().__init__()  # С помощью функции super вызывем конструктор из родительского класса

        self.setGeometry(700, 200, 450, 650)  # Выбираем отступы, ширу и высоту окна
        self.setWindowTitle('КБЖУ')  # Указываем название приложения

        self.heading = QLabel()  # Создаем заголовок приложения
        self.heading.setText('Заголовок')  # Текст в этом заголовке
        self.heading.setStyleSheet('background-color: rgb(68, 207, 203);')  # Фон заголовка

        self.text_edit = QTextEdit()

        self.button_close = QPushButton('Закрыть')
        self.button_close.clicked.connect(self.close)

        self.button_save = QPushButton('Сохранить')

        layout_buttons = QHBoxLayout()
        layout_buttons.addWidget(self.button_save)
        layout_buttons.addWidget(self.button_close)

        main_layout = QVBoxLayout()
        main_layout.addWidget(self.heading)
        main_layout.addWidget(self.text_edit)
        main_layout.addLayout(layout_buttons)

        central_widget = QWidget()
        central_widget.setLayout(main_layout)

        self.setCentralWidget(central_widget)


# Функция которая создает приложение
def main():
    app = QApplication(sys.argv)  # создаем объект в качестве параметра предаём информацию о системе

    window = Window()  # Создаем объект(Окно  приложения) на основе нашего класса Window
    window.show()  # Метод show показывает созданное окно

    sys.exit(app.exec_())  # Корректное закрытие приложения


if __name__ == '__main__':
    main()

Результат:

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

→ Ссылка