0
我有一个包含几个辅助方法和属性引擎模块:在PyQT中如何打开有权访问父级属性的子窗口?
engine.py
class World:
def __init__(self):
# stuff
def foo(a, b):
c = a + b # trivial example
return c
然后我已经结合有UI文件main.py(在QtDesigner创建并转换为的.py使用脚本我有):
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.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
感谢,并感谢清理我的OP。为了保持代码的其余部分干净并防止重复,你会推荐做一些类似'self.child_world = self.parent()。world'吗?我认为最好给这个“世界”一个不同的名字,以防止它与父母的混淆。 – drewd423
使用您显示的代码访问父级方法。这个父亲不是遗产之一,它是一个父亲给予消除其他元素的有效方式的记忆 – eyllanesc
有些事情还是不对的。我现在得到一个新的错误,看到更新的OP。 – drewd423