在PyQT中如何打开可以访问父级属性的子窗口?

dre*_*423 5 python pyqt pyqt4 python-3.x

我有一个引擎模块,其中包含几个辅助方法和属性:

引擎.py

class World:
    def __init__(self):
        # stuff

    def foo(a, b):
        c = a + b # trivial example
        return c
Run Code Online (Sandbox Code Playgroud)

然后我有一个 main.py,其中包含 UI 文件(在 QtDesigner 中创建并使用我拥有的脚本转换为 .py):

主要.py

from PyQt4 import QtGui
import design1
import design2
import engine

class MainWindow(QtGui.QMainWindow, design1.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.world = engine.World()

        self.new_window_button.clicked.connect(self.open_new_window)

    def open_new_window(self):
        self.window_to_open = ChildWindow(self)
        self.window_to_open.show()

class ChildWindow(QtGui.QMainWindow, design2.Ui_MainWindow):
    def __init__(self, parent):
        super(ChildWindow, self).__init__(parent)
        self.setupUi(self)
        print(self.world.foo(1, 2)) # trivial example

def main():
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()
Run Code Online (Sandbox Code Playgroud)

如果我把线拔掉printChildWindow就可以正常打开。但随着它的出现,我得到了错误:

AttributeError:“ChildWindow”对象没有属性“world”

我知道我在做一些愚蠢的事情,但我无法弄清楚。

编辑main.py

from PyQt4 import QtGui
import design1
import design2
import engine

class MainWindow(QtGui.QMainWindow, design1.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.world = engine.World()

        self.new_window_button.clicked.connect(self.open_new_window)

    def open_new_window(self):
        self.window_to_open = ChildWindow(self)
        self.window_to_open.show()

class ChildWindow(QtGui.QMainWindow, design2.Ui_MainWindow):
    def __init__(self, parent):
        super(ChildWindow, self).__init__(parent)
        self.setupUi(self)
        print(self.parent().world.foo(1, 2)) # trivial example

def main():
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()
Run Code Online (Sandbox Code Playgroud)

我现在收到错误:

类型错误:foo() 需要 2 个位置参数,但给出了 3 个

eyl*_*esc 2

该类ChildWindow没有 world 属性,但您可以通过the parent()函数访问它,该函数返回父级,因为您使用了以下语句:self.window_to_open = ChildWindow (self)

你必须改变

self.world.foo(1, 2)
Run Code Online (Sandbox Code Playgroud)

self.parent().world.foo(1, 2)
Run Code Online (Sandbox Code Playgroud)

您的方法必须声明为静态,因为它不使用 self 作为参数。

class World:
    def __init__(self):
        # stuff

    @staticmethod
    def foo(a, b):
        c = a + b # trivial example
        return c
Run Code Online (Sandbox Code Playgroud)

或者

def foo(self, a, b):
    c = a + b # trivial example
    return c
Run Code Online (Sandbox Code Playgroud)