Как создать программу с 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 шт):
Попробуйте использовать Qt Designer. Там можно создавать отдельные окна и формы, при этом они будут в разных класах. Скачать можно здесь или здесь. Туториалы - здесь и здесь
я оставил вам некоторые комментарии по тексту. Если что-то будет не понятно спросите.
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_())
