Python 如何在pyqt中的类之间进行继承?

Python 如何在pyqt中的类之间进行继承?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,为了跟踪进度,这是关于在PyQt5中练习不同课程的第三个问题。以下是我之前问题的链接: 我正在尝试使用两个类,一个是一个按钮,当它被按下时,它将加载一个文件并在另一个类的QTextEdit中显示文本 在第一个问题中,我被建议作为处理更多类的替代方法,它们可以从QMainWindow继承,因此我寻找了更多的信息: 第二个问题代码确实有效,但它会同时显示两个窗口,所以这个问题:引导我编写此代码(我在这里附上此代码,因为它与链接中的有点不同,并且我应用了它在回答中所说的内容): 在这段代码中,我没有继

为了跟踪进度,这是关于在PyQt5中练习不同课程的第三个问题。以下是我之前问题的链接:

我正在尝试使用两个类,一个是一个按钮,当它被按下时,它将加载一个文件并在另一个类的
QTextEdit
中显示文本

在第一个问题中,我被建议作为处理更多类的替代方法,它们可以从
QMainWindow
继承,因此我寻找了更多的信息:

第二个问题代码确实有效,但它会同时显示两个窗口,所以这个问题:引导我编写此代码(我在这里附上此代码,因为它与链接中的有点不同,并且我应用了它在回答中所说的内容):

在这段代码中,我没有继承,但它工作得很好

问题是,当我尝试在原始问题代码中遵循相同的语法时,它将无法运行,我不确定我是否得到了良好的继承

import sys
import os
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWidgets import QPushButton, QVBoxLayout, QTextEdit, QHBoxLayout, QLabel, QMainWindow, QAction, QFileDialog

class SecondWindow(QWidget):
    def __init__(self, Window):
        super(SecondWindow, self).__init__(parent, QtCore.Qt.Window)

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.text = QTextEdit(self)
        self.btn_return= QPushButton("Return")
        self.init_ui()

    def init_ui(self):
        v_layout = QVBoxLayout(self)
        v_layout.addWidget(self.text)
        v_layout.addWidget(self.btn_return)
        self.setLayout(v_layout)
        self.setWindowTitle('Opened Text')

        self.btn_return.clicked.connect(self.closeAndReturn)

    def closeAndReturn(self):
        self.close()
        self.parent().show()

class Window(QMainWindow):

    textChanged = QtCore.pyqtSignal(str)

    def __init__(self, *args):
        super(Window, self).__init__()

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.img = QLabel()
        self.load_file= QPushButton('Load')

        self.width = 400
        self.height = 150        

        self.init_ui()

    def init_ui(self):
        self.img.setPixmap(QtGui.QPixmap("someimage.png"))


        h_layout = QHBoxLayout()
        v_layout = QVBoxLayout()
        h_final = QHBoxLayout()

        h_layout.addWidget(self.img)

        v_layout.addWidget(self.load_file)

        h_final.addLayout(h_layout)
        h_final.addLayout(v_layout)

        self.load_file.clicked.connect(self.loadafile)

        self.setLayout(h_final)
        self.setWindowTitle('Main Window')
        self.setGeometry(600,150,self.width,self.height)

    @QtCore.pyqtSlot()
    def loadafile(self):
        filename = QFileDialog.getOpenFileName(self, 'Open File', os.getenv('HOME'))
        with open(filename[0], 'r') as f:
            file_text = f.read()
            self.textChanged.emit(file_text)

        self.hide()
        self.dialog_02 = SecondWindow(self)
        self.dialog_02.show()

def main():
    app = QApplication(sys.argv)
    main = Window()
    s = SecondWindow(main)
    main.textChanged.connect(s.text.append)
    main.show()



    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

您正在耦合许多类:如果SecondWindow没有父类会发生什么?嗯,您的代码将有问题,您必须对其进行大量修改,以使其正常工作。因此,首先要设计每个类的行为,例如,SecondWindow必须警告其他窗口它被单击,它必须有一个更新文本的方法。同样,窗口必须通知有新文本可用

另一方面,QMainWindow已经有了一个窗口,因此您必须创建一个中心widget,在其中放置其他小部件

import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class SecondWindow(QtWidgets.QWidget):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent, QtCore.Qt.Window)
        self.text = QtWidgets.QTextEdit()
        self.btn_return= QtWidgets.QPushButton("Return")
        self.init_ui()

    def init_ui(self):
        v_layout = QtWidgets.QVBoxLayout(self)
        v_layout.addWidget(self.text)
        v_layout.addWidget(self.btn_return)
        self.setWindowTitle('Opened Text')
        self.btn_return.clicked.connect(self.close)
        self.btn_return.clicked.connect(self.closed)

    @QtCore.pyqtSlot(str)
    def update_text(self, text):
        self.text.setText(text)
        self.show()

class Window(QtWidgets.QMainWindow):
    textChanged = QtCore.pyqtSignal(str)

    def __init__(self, *args):
        super(Window, self).__init__()
        self.img = QtWidgets.QLabel()
        self.load_file= QtWidgets.QPushButton('Load')
        self.width = 400
        self.height = 150        
        self.init_ui()

    def init_ui(self):
        self.img.setPixmap(QtGui.QPixmap("someimage.png"))
        self.load_file.clicked.connect(self.loadafile)
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        h_layout = QtWidgets.QHBoxLayout(central_widget)
        h_layout.addWidget(self.img)
        h_layout.addWidget(self.load_file)
        self.setWindowTitle('Main Window')
        self.setGeometry(600,150,self.width,self.height)

    @QtCore.pyqtSlot()
    def loadafile(self):
        filename, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Open File', os.getenv('HOME'))
        if filename:
            with open(filename, 'r') as f:
                file_text = f.read()
                self.textChanged.emit(file_text)
                self.close()

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = Window()
    s = SecondWindow()
    main.textChanged.connect(s.update_text)
    s.closed.connect(main.show)
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class SecondWindow(QtWidgets.QWidget):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent, QtCore.Qt.Window)
        self.text = QtWidgets.QTextEdit()
        self.btn_return= QtWidgets.QPushButton("Return")
        self.init_ui()

    def init_ui(self):
        v_layout = QtWidgets.QVBoxLayout(self)
        v_layout.addWidget(self.text)
        v_layout.addWidget(self.btn_return)
        self.setWindowTitle('Opened Text')
        self.btn_return.clicked.connect(self.close)
        self.btn_return.clicked.connect(self.closed)

    @QtCore.pyqtSlot(str)
    def update_text(self, text):
        self.text.setText(text)
        self.show()

class Window(QtWidgets.QMainWindow):
    textChanged = QtCore.pyqtSignal(str)

    def __init__(self, *args):
        super(Window, self).__init__()
        self.img = QtWidgets.QLabel()
        self.load_file= QtWidgets.QPushButton('Load')
        self.width = 400
        self.height = 150        
        self.init_ui()

    def init_ui(self):
        self.img.setPixmap(QtGui.QPixmap("someimage.png"))
        self.load_file.clicked.connect(self.loadafile)
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        h_layout = QtWidgets.QHBoxLayout(central_widget)
        h_layout.addWidget(self.img)
        h_layout.addWidget(self.load_file)
        self.setWindowTitle('Main Window')
        self.setGeometry(600,150,self.width,self.height)

    @QtCore.pyqtSlot()
    def loadafile(self):
        filename, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Open File', os.getenv('HOME'))
        if filename:
            with open(filename, 'r') as f:
                file_text = f.read()
                self.textChanged.emit(file_text)
                self.close()

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = Window()
    s = SecondWindow()
    main.textChanged.connect(s.update_text)
    s.closed.connect(main.show)
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()