Python PySide(内部C++对象已删除)

27

我最近决定使用Python和PySide编写我的第一个应用程序。但是我遇到了一个问题,希望你们可以帮忙。

Python不断引发异常,指出“Internal C++ Object”已删除。从我有限的Python经验中,我认为我的对象超出了作用域,并被Python的垃圾收集器删除了。

那么,如何在Python中设计多页面应用程序,并能够保留我的QWidgets,以便我可以再次显示该页面呢?

谢谢您的时间。

更新(代码)

instancing = None
def instance():
   global instancing
   if instancing == None:
      instancing = WPZKernel()
   return instancing

class WPZKernel:
    win = None
    mainscreen = None

    def mainwindow(self):
        if self.win == None:
          self.win = GMKMainWindow(self)
        return self.win

    def main_panel(self):
        if self.mainscreen == None:
           self.mainscreen = GMKMainScreen(self.mainwindow())
        return self.mainscreen

通常情况下,我会通过调用以下代码来访问mainpanel:

import kernel
kernel.instance().main_panel()

所以我这样做是错的吗?


可以提供一些引发异常的示例代码吗? - gruszczy
2个回答

24
在一番搜寻和纠结之后,我找到了解决方法。我通过将页面设置为中央窗口小部件来显示所有页面,但在阅读QMainWindow文档时,发现我的小部件基本上会被qt删除,如下所述:

注意:QMainWindow接管了小部件指针并在适当的时候将其删除。

因此,要开发多页应用程序,请查看QStackedWidget


9
我猜QT和用户并不总是对“适当的时间”有相同的理解。 - derchambers

17

参见这里:PySide错误

如果在Python中,一个QObject超出了其作用域,它会被删除。你需要注意保持对该对象的引用:

  • 将其存储为要保留的对象的属性,例如self.window = QMainWindow()
  • 向对象的构造函数传递一个父QObject,以便由父对象拥有

我存储为属性的对象必须是QObject或QWidget吗? - Johann du Toit
不,只要对象不超出作用域,任何Python对象都可以。 - Janne Karila
好的,但我的实例对象何时超出范围?我通过调用kernel.instance().bootstrap()来启动应用程序,所有其他小部件都会调用kernel.instance().mainwindow(),如果它们需要mainwindow或其他小部件。 - Johann du Toit
嗯...我刚刚才看了一下代码,似乎没问题,“实例化”并没有超出作用域。 - Janne Karila
我遇到了原始问题中的问题,但很难复现,有没有办法可以手动触发它? - sunyata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接