在PyQt的子窗口中从父窗口访问数据

时间:2018-09-25 08:07:29

标签: python pyqt pyqt4

我有两个具有相同名称的窗口(App.py和ChildApp.py)和.ui文件。

enter image description here

App.py:

import sys
from PyQt4 import QtCore, QtGui, uic
from ChildApp import ChildApp
qtCreatorFile = "App.ui" # Enter file here.
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
class App(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.message = None
        self.child_window = ChildApp()
        self.pushButton.clicked.connect(self.sendMessage)
    def sendMessage(self):
        self.message = self.lineEdit.text()
        self.child_window.show()
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec_())

ChildApp.py:

import sys
from PyQt4 import QtCore, QtGui, uic
qtCreatorFile = "ChildApp.ui" # Enter file here.
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
class ChildApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.alertmessage)
    def alertmessage(self):
        message = "test"
        self.label.setText("Message : "+message)
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = ChildApp()
    window.show()
    sys.exit(app.exec_())

在Main.py文件中,我有一个变量self.message。 当我单击“用文本执行操作”按钮时,文本框中的文本将分配给self.message并打开子窗口。

现在在子窗口中,当我单击按钮“显示消息”时,将调用方法alertmessage(),该方法在其中设置了message = "text"。 必须从MainApp.py中将此变量message分配给self.message的值。

请帮助

谢谢

2 个答案:

答案 0 :(得分:1)

我认为您无法从父母那里获得本地数据。我将执行以下操作:

lineEdit中更改文本时,使用信号更新子代:

self.lineEdit.textChanged.connect(self.updateChild)

在主窗口中添加此功能:

def updateChild(self):
    self.child_window.setMessage(self.lineEdit.text())

并在子窗口中保持变量self._message的更新:

def setMessage(self, message):
    self._message=message

这样,无论何时需要此变量,它都是最新的

答案 1 :(得分:0)

以这种方式给孩子打电话:

    self.child_window = ChildApp(parent=self)

以这种方式定义子应用程序:

class ChildApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent):
        self.parent = parent

您可以通过self.parent.whatever

使用父变量

它必须工作,但是我不建议这样做,因为您不应该知道从孩子那里来的父母的字段。