Как использовать второй класс в основном классе в качестве метода

#python #class #inheritance #pyqt5

#python #класс #наследование #pyqt5

Вопрос:

Мой рабочий стол основного класса не возвращает кнопки второго класса.Почему это происходит. Я создавал метод add_button в основном классе, не используя второй класс, но часть initUI перестала работать из-за наследования, поэтому я принял решение создать дополнительный класс

 class Another_desktop(QMainWindow):
    def add_button(self):
        self.btn_play=QPushButton()
        self.btn_play.setStyleSheet('background-color: blue')
        self.btn_play.setIcon(QtGui.QIcon('icons8-circled-play-120.png'))
        self.btn_play.setIconSize(QtCore.QSize(22,22))
        self.btn_play.move(10,40)
        self.btn_stop=QPushButton()
        self.btn_stop.setStyleSheet('background-color: blue')
        self.btn_stop.setIcon(QtGui.QIcon('icons8-pause-button-40.png'))
        self.btn_stop.setIconSize(QtCore.QSize(22,22))
        self.btn_stop.move(50,40)
        self.btn_next=QPushButton()
        self.btn_next.setStyleSheet('background-color: blue')
        self.btn_next.setIcon(QtGui.QIcon('icons8-back-40.png'))
        self.btn_next.setIconSize(QtCore.QSize(22,22))
        self.btn_next.move(200,40)


class Desktop(QMainWindow):
    def __init__(self):
        super().__init__()
        self.__count=0
        self.__layout=0
        self.add_button()
        self.__button_open()
        self.click()
        self.initUI()

    def initUI(self):
        exitAction = QAction(QIcon('exit.png'), 'amp;Exit', self)
        exitAction.setShortcut('Ctrl Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)
        self.statusBar()
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('amp;File')
        fileMenu.addAction(exitAction)
        self.background=self.setStyleSheet('background-color:blue')
        self.size=self.setGeometry(200,200,300,300)
        self.title=self.setWindowTitle('app')
        self.show()

    def add_button(self):
        self.add_but=Another_desktop().add_button()
  

Ответ №1:

Если вы хотите добавить кнопки в свой основной класс, вам не следует создавать другой класс.

В Qt для виджета, подобного кнопке, чтобы быть частью окна, он должен быть дочерним элементом окна, а чтобы быть дочерним элементом окна, существует как минимум 2 способа: установить виджет в макет, который принадлежит окну, чтобы иметь в качестве родительского элемента элемент окнав случае виджетов, таких как QPushButton, родительский элемент передается в конструкторе.

С другой стороны, я вижу, что у вас есть код, который не имеет смысла, например:

 self.background=self.setStyleSheet('background-color:blue')
self.size=self.setGeometry(200,200,300,300)
self.title=self.setWindowTitle('app')
  

функции setXXX в Qt ничего не возвращают, поскольку они являются установщиками, поэтому self.background, self.size и self.title будут None .

 from PyQt5 import QtCore, QtGui, QtWidgets


class Desktop(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.__count = 0
        self.__layout = 0
        self.add_button()
        # self.__button_open()
        # self.click()
        self.initUI()

    def initUI(self):
        exitAction = QtWidgets.QAction(QtGui.QIcon("exit.png"), "amp;Exit", self)
        exitAction.setShortcut("Ctrl Q")
        exitAction.setStatusTip("Exit application")
        exitAction.triggered.connect(QtWidgets.qApp.quit)
        menubar = self.menuBar()
        fileMenu = menubar.addMenu("amp;File")
        fileMenu.addAction(exitAction)
        self.setStyleSheet("background-color:blue")
        self.setGeometry(200, 200, 300, 300)
        self.setWindowTitle("app")
        self.show()

    def add_button(self):
        self.btn_play = QtWidgets.QPushButton(self) # <--- set parent of btn_play
        # to self
        self.btn_play.setStyleSheet("background-color: blue")
        self.btn_play.setIcon(QtGui.QIcon("icons8-circled-play-120.png"))
        self.btn_play.setIconSize(QtCore.QSize(22, 22))
        self.btn_play.move(10, 40)
        self.btn_stop = QtWidgets.QPushButton(self)
        self.btn_stop.setStyleSheet("background-color: blue")
        self.btn_stop.setIcon(QtGui.QIcon("icons8-pause-button-40.png"))
        self.btn_stop.setIconSize(QtCore.QSize(22, 22))
        self.btn_stop.move(50, 40)
        self.btn_next = QtWidgets.QPushButton(self)
        self.btn_next.setStyleSheet("background-color: blue")
        self.btn_next.setIcon(QtGui.QIcon("icons8-back-40.png"))
        self.btn_next.setIconSize(QtCore.QSize(22, 22))
        self.btn_next.move(200, 40)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Desktop()
    w.show()
    sys.exit(app.exec_())
  

Комментарии:

1. как я могу указать здесь(self.btn_play = QtWidgets. QPushButton(self)) ссылка на другой класс

2. @PhilipVasilevski Если вы это сделаете, кнопка будет принадлежать другому окну

3. @PhilipVasilevski Почему вы создали класс Another_Desktop?, по крайней мере, в вашем вопросе это не объясняется

4. Я подумал, что когда я говорю «self», мой self.btn_play ссылается на QMainWindow, я хочу, чтобы «self» ссылался на Qwidget, потому что, если я не определил Qwidget, возвращаются кнопки so, но их размер остается постоянным. Я думаю, что эта ошибка связана с наследованием, не могли бы вы объяснить, как это работает

5. @PhilipVasilevski self не имеет ничего общего с наследованием, чтобы вы поняли, я приведу аналогию: когда говорят, что Филипп живет в ХХХ, а я живу в ХХХ, в первом случае кто-то говорит о вас, а во втором случае вы сами говорите о себе. So self относится к тому факту, что сам объект модифицируется, то есть self is относительно класса