From 5cc46f2f1342e085897eefd06eda453e2f28b5bc Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Fri, 9 Jul 2010 18:27:39 -0300 Subject: Fixed layout reference control on layouts. Reviewer: Luciano Wolf --- PySide/QtGui/glue/qlayout_help_functions.h | 28 ++++++++++++++++++++++------ PySide/QtGui/glue/qwidget_glue.h | 10 ++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) (limited to 'PySide/QtGui/glue') diff --git a/PySide/QtGui/glue/qlayout_help_functions.h b/PySide/QtGui/glue/qlayout_help_functions.h index cea0b5611..9e07ff5d3 100644 --- a/PySide/QtGui/glue/qlayout_help_functions.h +++ b/PySide/QtGui/glue/qlayout_help_functions.h @@ -3,24 +3,40 @@ void addLayoutOwnership(QLayout *layout, QLayoutItem *item); +inline QString retrieveObjectName(PyObject *obj) +{ + Shiboken::AutoDecRef objName(PyObject_Str(obj)); + return QString(PyString_AsString(objName)); +} + inline void addLayoutOwnership(QLayout *layout, QWidget *widget) { //transfer ownership to parent widget QWidget *parent = layout->parentWidget(); - if (!parent) - return; - Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(parent)); - Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); - Shiboken::setParent(pyParent, pyChild); + if (!parent) { + //keep the reference while the layout is orphan + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(layout)); + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); + Shiboken::keepReference(reinterpret_cast(pyParent.object()), qPrintable(retrieveObjectName(pyParent)), pyChild, true); + } else { + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(parent)); + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); + Shiboken::setParent(pyParent, pyChild); + } } inline void addLayoutOwnership(QLayout *layout, QLayout *other) { //transfer all children widgetes from other to layout parent widget QWidget *parent = layout->parentWidget(); - if (!parent) + if (!parent) { + //keep the reference while the layout is orphan + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(layout)); + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(other)); + Shiboken::keepReference(reinterpret_cast(pyParent.object()), qPrintable(retrieveObjectName(pyParent)), pyChild, true); return; + } for (int i=0, i_max=other->count(); i < i_max; i++) { addLayoutOwnership(layout, other->itemAt(i)); diff --git a/PySide/QtGui/glue/qwidget_glue.h b/PySide/QtGui/glue/qwidget_glue.h index a6cd3b7d4..948852240 100644 --- a/PySide/QtGui/glue/qwidget_glue.h +++ b/PySide/QtGui/glue/qwidget_glue.h @@ -1,3 +1,10 @@ +static QString retrieveObjectName(PyObject *obj) +{ + Shiboken::AutoDecRef objName(PyObject_Str(obj)); + return QString(PyString_AsString(objName)); +} + + /** * Tranfer objects ownership from layout to widget **/ @@ -26,6 +33,9 @@ qwidgetReparentLayout(QWidget *parent, QLayout *layout) Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(layout)); Shiboken::setParent(pyParent, pyChild); + + //remove previous references + Shiboken::keepReference(reinterpret_cast(pyChild.object()), qPrintable(retrieveObjectName(pyChild)), Py_None); } static inline void -- cgit v1.2.3