From 4a2bfc9239c13272478185ce056e481d7aa1106b Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Tue, 18 Jan 2011 16:59:06 -0200 Subject: Fix bug#552 - "Segmentation fault when using QUiLoader and QTabWidget" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewer: Renato Araújo Marcelo Lira --- PySide/QtGui/typesystem_gui_common.xml | 1 - libpyside/pyside.cpp | 6 +++-- tests/QtUiTools/CMakeLists.txt | 1 + tests/QtUiTools/bug_552.py | 21 +++++++++++++++++ tests/QtUiTools/bug_552.ui | 42 ++++++++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 tests/QtUiTools/bug_552.py create mode 100644 tests/QtUiTools/bug_552.ui diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index 27df7d3c0..1f0078918 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -3748,7 +3748,6 @@ QWidget* tab = %CPPSELF.widget(%1); if (tab) { Shiboken::AutoDecRef pyWidget(%CONVERTTOPYTHON[QWidget*](tab)); - Shiboken::Object::setParent(0, pyWidget); %CPPSELF.%FUNCTION_NAME(%1); } diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp index 5cb107ae4..08c12f80c 100644 --- a/libpyside/pyside.cpp +++ b/libpyside/pyside.cpp @@ -112,8 +112,10 @@ static void destructionVisitor(SbkObject* pyObj, void* data) PyTypeObject* pyQObjectType = reinterpret_cast(realData[1]); if (pyObj != pyQApp && PyObject_TypeCheck(pyObj, pyQObjectType)) { - if (Shiboken::Object::hasOwnership(pyObj)) - Shiboken::callCppDestructor(Shiboken::Object::cppPointer(pyObj, Shiboken::SbkType())); + if (Shiboken::Object::hasOwnership(pyObj) && Shiboken::Object::isValid(pyObj, false)) { + Shiboken::callCppDestructor(Shiboken::Object::cppPointer(pyObj, pyQObjectType)); + Shiboken::Object::setValidCpp(pyObj, false); + } } }; diff --git a/tests/QtUiTools/CMakeLists.txt b/tests/QtUiTools/CMakeLists.txt index ebf7a23ec..131adfed1 100644 --- a/tests/QtUiTools/CMakeLists.txt +++ b/tests/QtUiTools/CMakeLists.txt @@ -2,5 +2,6 @@ PYSIDE_TEST(bug_360.py) PYSIDE_TEST(bug_376.py) PYSIDE_TEST(bug_392.py) PYSIDE_TEST(bug_426.py) +PYSIDE_TEST(bug_552.py) PYSIDE_TEST(uiloader_test.py) PYSIDE_TEST(ui_test.py) diff --git a/tests/QtUiTools/bug_552.py b/tests/QtUiTools/bug_552.py new file mode 100644 index 000000000..6a93040a9 --- /dev/null +++ b/tests/QtUiTools/bug_552.py @@ -0,0 +1,21 @@ +from helper import adjust_filename +from PySide import QtGui, QtCore +from PySide.QtUiTools import QUiLoader + +class View_1(QtGui.QWidget): + + def __init__(self): + QtGui.QWidget.__init__(self) + loader = QUiLoader() + widget = loader.load(adjust_filename('bug_552.ui', __file__), self) + self.children = [] + for child in widget.findChildren(QtCore.QObject, None): + self.children.append(child) + self.t = widget.tabWidget + self.t.removeTab(0) + +app = QtGui.QApplication([]) +window = View_1() +window.show() + +# If it doesn't crash it works :-) diff --git a/tests/QtUiTools/bug_552.ui b/tests/QtUiTools/bug_552.ui new file mode 100644 index 000000000..f98da4421 --- /dev/null +++ b/tests/QtUiTools/bug_552.ui @@ -0,0 +1,42 @@ + + + Form + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + 130 + 80 + 139 + 80 + + + + 0 + + + + Tab 1 + + + + + Tab 2 + + + + + + + -- cgit v1.2.3