Как создать программу с PyQt5 из нескольких классов?

Имеется идея создания простого приложения с использованием PyQt5, но хочу разделить его на несколько классов, отвечающих каждый за свое дело.

Допустим, класс Skeleton(код представлен ниже) будет строить "скелет" программы, то есть создавать само окно, его размеры и название.

А другой класс, допустим FormBuilder должен бы создавать в окне, которое создал класс 'Skeleton' формы какие-нибудь. Но у меня не получается написать код для второго класса. Можете, пожалуйста, помочь?

Класс 'Skeleton':

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication


class SkeletonOfWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.build_skeleton_with_basic_settings()

    def build_skeleton_with_basic_settings(self):
        self.setFixedSize(800, 600)
        self.setWindowTitle('Plates')
        self.show()


class FormBuilder:
    pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = SkeletonOfWindow()
    sys.exit(app.exec_())

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

Автор решения: Alex Zab

Попробуйте использовать Qt Designer. Там можно создавать отдельные окна и формы, при этом они будут в разных класах. Скачать можно здесь или здесь. Туториалы - здесь и здесь

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

я оставил вам некоторые комментарии по тексту. Если что-то будет не понятно спросите.

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, \
    QGridLayout, QPushButton, QLabel, QHBoxLayout, QVBoxLayout
from PyQt5.QtCore import QTimer, QTime, Qt
from PyQt5.QtGui import QFont


class FormBuilder(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle('FormBuilder')
        self.setObjectName('formBuilder')
        self.resize(300, 200)

        self.label = QLabel()
        font = QFont('Arial', 20, QFont.Bold)
        self.label.setFont(font)

        self.start = QPushButton("Start")
        self.start.clicked.connect(self.startTime)

        self.pause = QPushButton("Pause")
        self.pause.clicked.connect(self.pauseTime)        
        
        layoutH = QHBoxLayout()
        layoutH.addWidget(self.start)
        layoutH.addWidget(self.pause)

        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addLayout(layoutH)

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.showTime)
        self.current_time = QTime(0, 0)

    def startTime(self):                                          
        self.timer.start(1000)
        
    def pauseTime(self):                                          
        self.timer.stop()

    def showTime(self):
        self.current_time = self.current_time.addSecs(1)
        label_time = self.current_time.toString('mm:ss')
        self.label.setText(label_time)
    

class SkeletonOfWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        # https://doc.qt.io/qt-5/qmainwindow.html#details
        self.centralWidget = QWidget()                         # +++
        self.setCentralWidget(self.centralWidget)              # +++
        
        self.build_skeleton_with_basic_settings()
        
        # создать экземпляр класса FormBuilder
        self.formBuilder = FormBuilder()    
        # разместить объект `self.formBuilder` в менеджер компоновки        
        self.grid.addWidget(self.formBuilder, 0, 0, alignment=Qt.AlignRight | Qt.AlignTop)

    def build_skeleton_with_basic_settings(self):
#?        self.setFixedSize(800, 600)
        self.setWindowTitle('Plates')
        
        # создать менеджер компоновки 
        self.grid = QGridLayout(self.centralWidget)             # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = SkeletonOfWindow()
    ex.resize(800, 600)
    ex.show()
    sys.exit(app.exec_())

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

→ Ссылка