我如何在PYQT中的类之间继承



为了跟踪进度,这是关于pyqt5中不同类别练习的第三个问题。这里是我以前的问题的链接:打开新窗口,从主窗口打开文件到PYQT5(不同文件)中的新窗口。

我正在尝试与两个类一起工作,一个使用一个按钮,当按下它会加载文件并在其他类中的QTextEdit中显示文本。

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

第二个问题代码确实有效,但它将同时显示两个窗口,所以这个问题:pyqt:如何隐藏qmainwindow指导我编写此代码(我在这里添加了此代码,因为它与那个代码有所不同在链接中,加上我在答案中说的话):

import sys, os
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
class Dialog_02(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Dialog_02, self).__init__(parent, QtCore.Qt.Window)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        myBoxLayout = QVBoxLayout()
        Button_02 = QPushButton ("Show Dialog 01")
        myBoxLayout.addWidget(Button_02)
        self.setLayout(myBoxLayout)
        self.setWindowTitle('Dialog 02')
        Button_02.clicked.connect(self.closeAndReturn)
    def closeAndReturn(self):
        self.close()
        self.parent().show()

class Dialog_01(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Dialog_01, self).__init__()
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        myBoxLayout = QVBoxLayout()
        Button_01 = QPushButton ("Show Dialog 02")
        myBoxLayout.addWidget(Button_01)
        self.setLayout(myBoxLayout)
        self.setWindowTitle('Dialog 01')
        Button_01.clicked.connect(self.callAnotherQMainWindow)
    def callAnotherQMainWindow(self):
        self.hide()
        self.dialog_02 = Dialog_02(self)
        self.dialog_02.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    sys.exit(app.exec_())

在此代码中,我不继承,但可以正常工作。

问题是,当我尝试遵循原始问题代码中的同一语法时,它不会运行,我不确定我的继承是否正常。

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()

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

另一方面
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()

最新更新