2011-03-17 42 views
8

我最近决定用Python和PySide编写我的第一个应用程序。但我有一个问题,希望你们可以帮忙。Python PySide(已删除内部C++对象)

Python不断抛出“Internal C++ Object”被删除的异常。从我有限的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 

然后,我会通常通过调用访问的mainPanel:

import kernel 
kernel.instance().main_panel() 

所以我要对这个错误的方式?

+0

如何提出一些示例代码,引发异常? – gruszczy 2011-03-17 12:43:42

回答

6

一些搜索和头发拉后拥有 ,我找到了解决办法。我显示的所有页面将其设定为中央窗口部件,并读取QMainWindow documentation,当我发现我的小部件基本上被被Qt删除,说:

注:QMainWindow中采取的 小部件指针和删除所有权它在 适当的时候。

因此,要开发一个多页面应用程序,而不是看看QStackedWidget

5

请看这里:PySide Pitfalls

如果一个QObject超出了范围 Python,它将被删除。你必须 采取保持引用 对象的护理:

  • 商店它你不停地围绕一个对象的属性,例如 self.window =的QMainWindow()
  • 传递父母的QObject对象的构造函数,所以它就会被父
+0

我将它存储为属性的对象是否必须是QObject或QWidget? – 2011-03-17 12:57:47

+0

不,任何Python对象都会这样做,只要对象不超出范围即可。 – 2011-03-17 14:20:03

+0

好的,但我的实例对象超出范围?我通过调用kernel.instance()。bootstrap()和所有其他小部件调用kernel.instance()。mainwindow()(如果它们需要mainwindow或其他小部件)来启动应用程序。 – 2011-03-17 14:22:14