Python Pyside (objeto C ++ interno ya eliminado)
Pregunta
Recientemente decidí escribir mi primera aplicación con Python y Pyside. Pero tengo un problema y espero que puedan ayudarlo.
Python sigue aumentando las excepciones de que se elimina el "objeto C ++ interno". Desde mi experiencia limitada con Python, creo que mi objeto está saliendo del alcance y la eliminación del recolector de basura de Python.
Entonces, ¿cómo podría diseñar una aplicación de varias páginas en Python con Pyside? Y poder mantener mis Qwidgets para que pueda mostrar la página nuevamente.
Gracias por tu tiempo.
Actualización (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 normalmente accedería al mainpanel llamando:
import kernel
kernel.instance().main_panel()
Entonces, ¿estoy haciendo esto de la manera incorrecta?
Solución
Después de un poco de búsqueda y tirón del cabello, encontré la solución. Estaba mostrando todas las páginas estableciéndolas como el widget central y al leer el QMainWindow Documentation Descubrí que mi widget básicamente es eliminado por QT como se indica:
Nota: QmainWindow toma posesión del puntero del widget y lo elimina en el momento apropiado.
Entonces, desarrollar una aplicación de varias páginas en lugar de echar un vistazo a QStackedWidget.
Otros consejos
Mira aquí: Pyside trampfalls.
Si un Qobject cae del alcance en Python, se eliminará. Tienes que ocuparse de mantener una referencia al objeto:
- Guárdelo como un atributo de un objeto que mantiene, por ejemplo, Self.Window = QMainWindow ()
- Pase un Qobject matriz al constructor del objeto, por lo que es propiedad de los padres