Нужна помощь в понимании наследования в PyQt5 - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь организовать свой код в классы. В приведенном ниже примере B и C должны наследовать имена кнопок pu sh от A, чтобы при нажатии кнопки отображали оператор. Чтобы заставить это работать должным образом, мне пришлось создать Dummy и наследовать B и C, а затем создать в экземпляре Dummy. Не похоже, что это то, как я должен это делать. Есть ли «лучший» или «более приемлемый» способ использования нескольких классов в PyQt5?

inheritance.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'inheritance.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(452, 246)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.b_pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.b_pushButton.setGeometry(QtCore.QRect(40, 50, 151, 81))
        self.b_pushButton.setObjectName("b_pushButton")
        self.c_pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.c_pushButton.setGeometry(QtCore.QRect(230, 50, 151, 81))
        self.c_pushButton.setObjectName("c_pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 452, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.b_pushButton.setText(_translate("MainWindow", "B"))
        self.c_pushButton.setText(_translate("MainWindow", "C"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Основной скрипт:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from inheritance import Ui_MainWindow

class A(QMainWindow):
    def __init__(self):
        super(A, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

class B(A):
    def __init__(self):
        super(B, self).__init__()

        self.ui.b_pushButton.clicked.connect(self.pushB)

    def pushB(self):
        print('You pushed the "B" button')
        print()

class C(A):
    def __init__(self):
        super(C, self).__init__()

        self.ui.c_pushButton.clicked.connect(self.pushC)

    def pushC(self):
        print('You pushed the "C" button')
        print()

class Dummy(B, C):
    pass

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = Dummy()
    main.show()
    sys.exit(app.exec_())

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

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

В итоге я передал объект пользовательского интерфейса из A в __init__ из B и C. Не уверен, что это правильное кодирование, но оно работает.

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from inheritance import Ui_MainWindow

class A(QMainWindow):
    def __init__(self):
        super(A, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.B = B(self.ui)
        self.C = C(self.ui)

        self.ui.b_pushButton.clicked.connect(self.B.pushB)
        self.ui.c_pushButton.clicked.connect(self.C.pushC)

class B():
    def __init__(self, ui):
        self.ui = ui

    def pushB(self):
        if self.ui.b_checkBox.isChecked():
            print('You pushed the "B" button')
            print()
        else:
            print('Check the check box to print the correct statement.')

class C():
    def __init__(self, ui):
        self.ui = ui

    def pushC(self):
        if self.ui.c_checkBox.isChecked():
            print('You pushed the "C" button')
            print()
        else:
            print('Check the check box to print the correct statement.')

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = A()
    main.show()
    sys.exit(app.exec_())
0 голосов
/ 26 марта 2020

Я закончила тем, что предложила Эйлланс c. Сначала я пытался сохранить все, что связано с B и C, в их собственном классе, потому что мой код действительно длинный, но это подойдет.

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from inheritance import Ui_MainWindow

class A(QMainWindow):
    def __init__(self):
        super(A, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.B = B()
        self.C = C()

        self.ui.b_pushButton.clicked.connect(self.B.pushB)
        self.ui.c_pushButton.clicked.connect(self.C.pushC)

class B:
    def pushB(self):
        print('You pushed the "B" button')
        print()

class C:
    def pushC(self):
        print('You pushed the "C" button')
        print()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = A()
    main.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...