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

Имеются 2 класса: MainWindow и SetOfButtons, первый класс - главный, строящий скелет окна, а второй класс должен строить кнопки на скелете окна.

Так вот, как можно правильно передать объект окна классу кнопок, чтобы из класса кнопок можно было полностью управлять этим объектом?

Я уже пытался при инициализации класса MainWindow создавать объект класса SetOfButtons и передавать ему объект окна, получалось строить кнопки, но если дело доходило до проверки на нажатия и выполнения какого-либо действия, то всё ломалось.

Помогите пожалуйста. Ниже привожу примерный код двух классов:


    # file ProjectPaint.Main
    from ProjectPaint.Buttons import *
    import sys
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()

    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        exemplar = MainWindow()
        exemplar.show()
        sys.exit(app.exec_())
    
    -------------------------------------
    
    # file ProjectPaint.Buttons
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    
    
    class SetOfButtons(QWidget):
        def __init__(self):
            super().__init__()
            
        def build_main_buttons(self): # этот метод должен строить кнопки
            pass


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

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

Sorry, я не совсем понимаю, что вы хотите сделать. Посмотрите пример ниже, если что-то не так - уточните, что не так.

import sys
from PyQt5.Qt import *


#from ProjectPaint.Buttons import *
class SetOfButtons(QWidget):
    def __init__(self, num, parent=None):
        super(SetOfButtons, self).__init__(parent)
        
        self.num = num
        self.layout = QHBoxLayout(self)
        
        self.build_main_buttons()
        
    def build_main_buttons(self):          # этот метод должен строить кнопки
        for i in range(5):
            btn = QPushButton(f"btn {self.num}.{i}")
            btn.clicked.connect(lambda ch, btn=btn: self.on_clicked(btn))
            self.layout.addWidget(btn)
            
    def on_clicked(self, btn):
        print(f'btn: {btn.text()}')    
        
    
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget=QWidget(self)
        self.setCentralWidget(self.centralWidget)        
        self.num = 1
        
        buttonAdd = QPushButton("Add Widget")              
        buttonAdd.clicked.connect(self.add_widget)
        
        self.layout = QVBoxLayout(self.centralWidget)
        self.layout.addWidget(buttonAdd, alignment=Qt.AlignBottom)

    def add_widget(self):
        setOfButtons = SetOfButtons(self.num, self)
        self.layout.insertWidget(self.layout.count()-1, setOfButtons) 
        self.num += 1        
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    exemplar = MainWindow()
    exemplar.show()
    sys.exit(app.exec_())

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

→ Ссылка