2011-03-17 10 views
8

Recientemente decidí escribir mi primera aplicación con Python y PySide. Pero tengo un problema y espero que ustedes puedan ayudar.Python PySide (Objeto interno de C++ ya eliminado)

Python sigue planteando excepciones que el "Objeto interno de C++" se elimina. A partir de mi experiencia limitada con Python, me imagino que mi objeto está saliendo de su alcance y será eliminado por el recolector de basura de Python.

Entonces, ¿cómo podría ir sobre el diseño de una aplicación de varias páginas en Python con PySide. Y poder mantener mis QWidgets para poder mostrar la página nuevamente.

Gracias por su tiempo.

Update (Código)

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 

Entonces yo normalmente acceder al mainpanel llamando:

import kernel 
kernel.instance().main_panel() 

Así que voy de este por el camino equivocado?

+0

¿Qué le parece presentar un código de ejemplo que plantea la excepción? – gruszczy

Respuesta

6

Después de buscar y tirar del pelo, he encontrado la solución. Me estaba mostrando todas las páginas configurarla como el widget central, y al leer el QMainWindow documentation me encontré con que mi aparato, básicamente, se elimina por qt como se indica:

Nota: QMainWindow toma posesión de el puntero del widget y eliminaciones en el momento apropiado.

Por lo tanto, para desarrollar una aplicación de varias páginas, más bien, consulte QStackedWidget.

5

Ver aquí: PySide Pitfalls.

Si un objeto QObject queda fuera de alcance en Python, se eliminará. Tiene cuidar de mantener una referencia a del objeto:

  • tienda como un atributo de un objeto se mantiene en torno a, por ejemplo, self.window = QMainWindow()
  • pasar una QObject padre para el constructor del objeto, por lo que recibe propiedad por el padre
+0

¿El objeto que almaceno como una propiedad tiene que ser un QObject o QWidget? –

+0

No, cualquier objeto de Python funcionará, siempre que el objeto no salga del alcance. –

+0

Bien, pero ¿dónde está mi objeto instancia fuera de alcance? Estoy iniciando la aplicación llamando a kernel.instance(). Bootstrap() y todos los demás widgets llaman a kernel.instance(). Mainwindow() si necesitan la ventana principal u otros widgets. –

Cuestiones relacionadas