aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Parente Lima <hugo.pl@gmail.com>2011-01-18 16:59:06 -0200
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:51:47 -0300
commit4a2bfc9239c13272478185ce056e481d7aa1106b (patch)
treeeafaeec4e27c5d172420a9e72dc456c45c03952a
parente9d1dc38e2940a2b25e8eb1060a4945f2c20b04c (diff)
Fix bug#552 - "Segmentation fault when using QUiLoader and QTabWidget"
Reviewer: Renato Araújo <renato.filho@openbossa.org> Marcelo Lira <marcelo.lira@openbossa.org>
-rw-r--r--PySide/QtGui/typesystem_gui_common.xml1
-rw-r--r--libpyside/pyside.cpp6
-rw-r--r--tests/QtUiTools/CMakeLists.txt1
-rw-r--r--tests/QtUiTools/bug_552.py21
-rw-r--r--tests/QtUiTools/bug_552.ui42
5 files changed, 68 insertions, 3 deletions
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);
}
</inject-code>
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<PyTypeObject*>(realData[1]);
if (pyObj != pyQApp && PyObject_TypeCheck(pyObj, pyQObjectType)) {
- if (Shiboken::Object::hasOwnership(pyObj))
- Shiboken::callCppDestructor<QObject>(Shiboken::Object::cppPointer(pyObj, Shiboken::SbkType<QObject*>()));
+ if (Shiboken::Object::hasOwnership(pyObj) && Shiboken::Object::isValid(pyObj, false)) {
+ Shiboken::callCppDestructor<QObject>(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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>80</y>
+ <width>139</width>
+ <height>80</height>
+ </rect>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ </widget>
+ <widget class="QWidget" name="tab_2">
+ <attribute name="title">
+ <string>Tab 2</string>
+ </attribute>
+ </widget>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>