gpt4 book ai didi

python - 在 PyQT 中如何打开一个可以访问父属性的子窗口?

转载 作者:行者123 更新时间:2023-12-04 03:13:16 25 4
gpt4 key购买 nike

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

引擎.py

class World:
def __init__(self):
# stuff

def foo(a, b):
c = a + b # trivial example
return c

然后我有一个包含 UI 文件的 main.py(在 QtDesigner 中创建并使用我拥有的脚本转换为 .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()

如果我取出 print线, ChildWindow打开很好。但是有了它,我得到了错误:

AttributeError: 'ChildWindow' object has no attribute '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()

我现在得到错误:

TypeError: foo() takes 2 positional arguments but 3 were given

最佳答案

ChildWindow类没有world的属性,但是可以通过the parent()访问函数,它返回父对象,因为您使用了以下语句:self.window_to_open = ChildWindow (self)
你必须改变

self.world.foo(1, 2)


self.parent().world.foo(1, 2)

您的方法必须声明为静态,因为它不使用 self 作为参数。
class World:
def __init__(self):
# stuff

@staticmethod
def foo(a, b):
c = a + b # trivial example
return c

或者
def foo(self, a, b):
c = a + b # trivial example
return c

关于python - 在 PyQT 中如何打开一个可以访问父属性的子窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com