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

Posted

技术标签:

【中文标题】在 PyQt 的子窗口中从父窗口访问数据【英文标题】:Access data from the parent window in a child window in PyQt 【发布时间】:2018-09-25 08:07:29 【问题描述】:

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

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。 当我点击“Do something with text”按钮时,文本框中的文本被分配给self.message,并打开子窗口。

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

请帮忙

谢谢

【问题讨论】:

【参考方案1】:

这样称呼孩子:

    self.child_window = ChildApp(parent=self)

以这种方式定义子应用:

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

可以通过self.parent.whatever使用父变量

它必须有效,但我不建议这样做,因为您不应该知道父子字段的字段。

【讨论】:

【参考方案2】:

我认为您无法从父级获取本地数据。我会做以下事情:

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

这样当你需要这个变量时,它是最新的

【讨论】:

我没有你正在使用的“.ui”,我没有尝试过这个代码,告诉我它是否有帮助 我可以从所有子窗口访问变量。但我想在所有子窗口中从父级访问变量 只需在updateChild函数中更新每个子窗口的变量。它甚至可以是一个窗口列表的循环。有用吗? 或者尝试在每个窗口的开头写“全局消息”,并使用“消息”变量而不是“self.message”。不确定他们是否使用共享内存

以上是关于在 PyQt 的子窗口中从父窗口访问数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqt中从对话框窗口检索数据到主窗口?

javascript, iframe, security - 尝试从父窗口访问 js 函数时权限被拒绝

如何在python pyqt5中从主窗口管理第二个窗口

子窗口访问父页面iframe中的iframe,top打开的子窗口访问父页面中的iframe中的iframe

从父窗口关闭子窗口

javascript中子窗口如何从父窗口继承css样式?