23

我最近决定用 Python 和 PySide 编写我的第一个应用程序。但是我有一个问题,希望你们能帮忙。

Python 不断引发“内部 C++ 对象”被删除的异常。根据我对 Python 的有限经验,我认为我的对象超出了范围并被 Python 的垃圾收集器删除。

那么我将如何使用 PySide 在 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

然后我通常会通过调用来访问主面板:

import kernel
kernel.instance().main_panel()

那么我会以错误的方式解决这个问题吗?

4

2 回答 2

19

经过一番搜索和拉头发后,我找到了解决方案。我通过将它们设置为中央小部件来显示所有页面,并且在阅读QMainWindow 文档时,我发现我的小部件基本上被 qt 删除,如下所述:

注意:QMainWindow 拥有小部件指针的所有权并在适当的时候将其删除。

因此,要开发多页应用程序,不如看看QStackedWidget

于 2011-03-19T18:12:44.127 回答
15

请参见此处:PySide 陷阱

如果 QObject 在 Python 中超出范围,它将被删除。您必须注意保持对对象的引用:

  • 将其存储为您保留的对象的属性,例如 self.window = QMainWindow()
  • 将父 QObject 传递给对象的构造函数,因此它由父对象拥有
于 2011-03-17T12:51:31.953 回答