我如何在PyQt中的类之间共享数据?

问题描述 投票:0回答:1

在我的PyQt5应用程序中,我想添加一个导入数据窗口,以确保在尝试从文件导入数据之前正确设置了定界符,跳过行等。显然,我希望这在单独的窗口中发生。我不会在此处发布完整的代码,只是一个类似的简单示例。

在此示例中,有两个窗口:主窗口和导入窗口。我想将简单的文本从导入窗口发送到主窗口。我的问题是我无法真正访问MainWindow的创建实例,因为这发生在main.py中。这是代码:

main.py

import sys
from logic import MainProgram
from PyQt5 import QtWidgets

def main():
    app = QtWidgets.QApplication(sys.argv)
    my_interface = MainProgram()
    my_interface.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

logic.py

from PyQt5.QtWidgets import QFileDialog
from PyQt5 import QtWidgets, QtCore

from mainwindow_ui import Ui_MainWindow
from import_ui import Ui_ImportPage

class MainProgram(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainProgram, self).__init__(parent)
        self.setupUi(self)
        self.open.clicked.connect(self.open_import_page)

    def open_import_page(self):
        self.window1 = ImportPage(self)
        self.window1.show()


class ImportPage(QtWidgets.QMainWindow, Ui_ImportPage):
    def __init__(self, parent=None):
        super(ImportPage, self).__init__(parent)
        self.setupUi(self)
        self.get.clicked.connect(self.get_text)

    def get_text(self):
        print(self.line.text()) # <--- this is want I want to send back to MainProgram class

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    my_interface = MainProgram()
    my_interface.show()
    sys.exit(app.exec_())

mainwindow_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.open = QtWidgets.QPushButton(self.centralwidget)
        self.open.setObjectName("open")
        self.verticalLayout.addWidget(self.open)
        self.line2 = QtWidgets.QLineEdit(self.centralwidget)
        self.line2.setPlaceholderText('Recieved from import page')
        self.verticalLayout.addWidget(self.line2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        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.open.setText(_translate("MainWindow", "Open import page"))


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_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_ImportPage(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("Import")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.get = QtWidgets.QPushButton('Send data to MainWindow', self.centralwidget)
        self.verticalLayout.addWidget(self.get)
        self.line = QtWidgets.QLineEdit(self.centralwidget)
        self.line.setObjectName("open")
        self.line.setPlaceholderText('Type here what you want to send to MainWindow')
        self.verticalLayout.addWidget(self.line)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        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", "Import"))

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

我应该更改代码的结构来实现这一点吗?有什么我想念的吗?感谢您的回答。

python pyqt pyqt5
1个回答
0
投票

您可以在MainProgram中访问ImportPage实例,并在该范围中创建它。因此,您应该进行必要的连接并获取文本:

class MainProgram(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainProgram, self).__init__(parent)
        self.setupUi(self)
        self.open.clicked.connect(self.open_import_page)
        self.window1 = ImportPage(self)
        self.window1.get.clicked.connect(self.on_clicked)

    def open_import_page(self):
        self.window1.show()

    def on_clicked(self):
        print(self.window1.line.text())
© www.soinside.com 2019 - 2024. All rights reserved.