繁体   English   中英

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

[英]How can I inherit between classes in pyqt?

为了跟踪进度,这是关于在PyQt5中使用不同类进行练习的第三个问题。以下是我以前的问题的链接: 打开一个新窗口在PyQt5中从主窗口打开一个文件到新窗口(在不同文件中)

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

在第一个问题中,我建议作为替代方案,可以使用更多类,它们可以从QMainWindow继承,因此我寻求更多信息以实现此目的: PyQt类继承

第二个问题代码确实起作用了,但是它会同时显示两个窗口,所以这个问题: 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()

您正在耦合许多类:如果SecondWindow暂时没有父级,该怎么办? 好吧,您的代码将有问题,您将不得不对其进行大量修改,以使其正常工作。 因此,首先要设计每个类的行为,例如SecondWindow必须警告其他窗口已单击它,它必须具有更新文本的方法。 同样,Window必须通知有新的文本可用。

另一方面,QMainWindow已经具有预定义的布局,因此您必须在放置其他小部件的位置创建一个中央窗口小部件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM