summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuciano Wolf <luciano.wolf@openbossa.org>2010-11-17 18:58:39 -0300
committerLuciano Wolf <luciano.wolf@openbossa.org>2010-11-17 19:10:02 -0300
commit16913eedcec8c71b129dfcb029e0eb0fc50bb2a1 (patch)
treea4521603dcb18b467f6bc52df0f9c5f19b25465c
parent5a8efeb9df4271b0e1ec47bf231d2f23141d2375 (diff)
downloadpyside-16913eedcec8c71b129dfcb029e0eb0fc50bb2a1.tar.gz
pyside-16913eedcec8c71b129dfcb029e0eb0fc50bb2a1.tar.xz
pyside-16913eedcec8c71b129dfcb029e0eb0fc50bb2a1.zip
Fix setLayout method that was causing segfault when itemAt wasn't implemented.
Reviewer: Hugo Parente <hugo.lima@openbossa.org> Renato Ara├║jo <renato.filho@openbossa.org>
-rw-r--r--PySide/QtGui/glue/qlayout_help_functions.h8
-rw-r--r--PySide/QtGui/glue/qwidget_glue.h22
-rw-r--r--PySide/QtGui/typesystem_gui_common.xml1
-rw-r--r--tests/QtGui/qlayout_test.py24
4 files changed, 43 insertions, 12 deletions
diff --git a/PySide/QtGui/glue/qlayout_help_functions.h b/PySide/QtGui/glue/qlayout_help_functions.h
index 0a6dd0e..452dbc1 100644
--- a/PySide/QtGui/glue/qlayout_help_functions.h
+++ b/PySide/QtGui/glue/qlayout_help_functions.h
@@ -28,7 +28,7 @@ inline void addLayoutOwnership(QLayout* layout, QWidget* widget)
inline void addLayoutOwnership(QLayout* layout, QLayout* other)
{
- //transfer all children widgetes from other to layout parent widget
+ //transfer all children widgets from other to layout parent widget
QWidget* parent = layout->parentWidget();
if (!parent) {
//keep the reference while the layout is orphan
@@ -39,7 +39,11 @@ inline void addLayoutOwnership(QLayout* layout, QLayout* other)
}
for (int i=0, i_max=other->count(); i < i_max; i++) {
- addLayoutOwnership(layout, other->itemAt(i));
+ QLayoutItem* item = layout->itemAt(i);
+ if (PyErr_Occurred())
+ return;
+
+ addLayoutOwnership(layout, item);
}
Shiboken::AutoDecRef pyParent(Shiboken::Converter<QLayout*>::toPython(layout));
diff --git a/PySide/QtGui/glue/qwidget_glue.h b/PySide/QtGui/glue/qwidget_glue.h
index 0339e89..d067d9f 100644
--- a/PySide/QtGui/glue/qwidget_glue.h
+++ b/PySide/QtGui/glue/qwidget_glue.h
@@ -12,21 +12,20 @@ static inline void qwidgetReparentLayout(QWidget *parent, QLayout *layout)
{
Shiboken::AutoDecRef pyParent(Shiboken::Converter<QWidget*>::toPython(parent));
- for (int i=0; i < layout->count(); i++)
- {
- QLayoutItem *item = layout->itemAt(i);
- QWidget *w = item->widget();
- if (w)
- {
+ for (int i=0; i < layout->count(); i++) {
+ QLayoutItem* item = layout->itemAt(i);
+ if (PyErr_Occurred())
+ return;
+
+ QWidget* w = item->widget();
+ if (w) {
QWidget* pw = w->parentWidget();
if (pw != parent) {
Shiboken::AutoDecRef pyChild(Shiboken::Converter<QWidget*>::toPython(w));
Shiboken::setParent(pyParent, pyChild);
}
- }
- else
- {
- QLayout *l = item->layout();
+ } else {
+ QLayout* l = item->layout();
if (l)
qwidgetReparentLayout(parent, l);
}
@@ -58,6 +57,9 @@ static inline void qwidgetSetLayout(QWidget *self, QLayout *layout)
if (oldParent != self) {
qwidgetReparentLayout(self, layout);
+ if (PyErr_Occurred())
+ return;
+
self->setLayout(layout);
}
}
diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml
index 59b8aa1..04ad22a 100644
--- a/PySide/QtGui/typesystem_gui_common.xml
+++ b/PySide/QtGui/typesystem_gui_common.xml
@@ -3371,6 +3371,7 @@
<modify-function signature="setLayout(QLayout *)">
<inject-code class="target" position="beginning">
qwidgetSetLayout(%CPPSELF, %1);
+ // %FUNCTION_NAME() - disable generation of function call.
</inject-code>
</modify-function>
<modify-function signature="enabledChange(bool)" remove="all"/>
diff --git a/tests/QtGui/qlayout_test.py b/tests/QtGui/qlayout_test.py
index 88c37aa..72c6d17 100644
--- a/tests/QtGui/qlayout_test.py
+++ b/tests/QtGui/qlayout_test.py
@@ -27,7 +27,22 @@ class MyLayout(QLayout):
def add(self, item):
self._list.append(item)
+class MissingItemAtLayout(QLayout):
+ def __init__(self, parent=None):
+ QLayout.__init__(self, parent)
+ self._list = []
+
+ def addItem(self, item):
+ self.add(item)
+ def addWidget(self, widget):
+ self.add(QWidgetItem(widget))
+
+ def count(self):
+ return len(self._list)
+
+ def add(self, item):
+ self._list.append(item)
#Test if a layout implemented in python, the QWidget.setLayout works
#fine because this implement som layout functions used in glue code of
@@ -71,5 +86,14 @@ class QLayoutTest(UsesQApplication):
self.assertEqual(sys.getrefcount(b), 2)
+ def testMissingFunctions(self):
+ w = QWidget()
+ b = QPushButton("test")
+ l = MissingItemAtLayout()
+
+ l.addWidget(b)
+
+ self.assertRaises(RuntimeError, w.setLayout, l)
+
if __name__ == '__main__':
unittest.main()