aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-06-14 14:59:26 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-06-14 15:15:47 -0300
commit569d1ab60e9b2227b2f4ed407718d17cc179d265 (patch)
treefa1e9a335c6c0b0101462a11a42659800ea08a4d
parent4284ae6cc69f6281140d960cfd6d62a94066bf36 (diff)
Fixed parent function return ownership.
Fixed QMainWindow functions ownership. Fixes #241. Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>, Marcelo Lira <marcelo.lira@openbossa.org>
-rw-r--r--PySide/QtCore/typesystem_core.xml3
-rw-r--r--PySide/QtGui/typesystem_gui_common.xml56
-rw-r--r--PySide/typesystem_templates.xml9
-rw-r--r--tests/QtGui/qmainwindow_test.py42
4 files changed, 92 insertions, 18 deletions
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml
index 85694e4ec..7249338d1 100644
--- a/PySide/QtCore/typesystem_core.xml
+++ b/PySide/QtCore/typesystem_core.xml
@@ -1049,6 +1049,9 @@
<modify-argument index="this">
<parent index="return" action="add"/>
</modify-argument>
+ <modify-argument index="return">
+ <define-ownership class="target" owner="default"/>
+ </modify-argument>
</modify-function>
<modify-function signature="setParent(QObject*)">
<modify-argument index="this">
diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml
index fac9f567b..7509850b4 100644
--- a/PySide/QtGui/typesystem_gui_common.xml
+++ b/PySide/QtGui/typesystem_gui_common.xml
@@ -1260,12 +1260,12 @@
</modify-argument>
</modify-function>
<modify-function signature="parentWidget() const">
- <modify-argument index="return">
- <define-ownership owner="target"/>
- </modify-argument>
<modify-argument index="this">
<parent index="return" action="add"/>
</modify-argument>
+ <modify-argument index="return">
+ <define-ownership class="target" owner="default"/>
+ </modify-argument>
</modify-function>
<modify-function signature="setMatrix(QMatrix, bool)" remove="all"/>
<modify-function signature="paint(QPainter*,const QStyleOptionGraphicsItem*,QWidget*)">
@@ -1689,26 +1689,46 @@
</object-type>
<object-type name="QMainWindow">
<modify-function signature="setCentralWidget(QWidget*)">
- <modify-argument index="1">
- <parent index="this" action="add"/>
- </modify-argument>
+ <inject-code class="target" position="beginning">
+ <insert-template name="replace_child">
+ <replace from="$FUNCTION_GET_OLD" to="centralWidget" />
+ <replace from="$CHILD_TYPE" to="QWidget" />
+ <replace from="$PYARG" to="%PYARG_1" />
+ </insert-template>
+ </inject-code>
</modify-function>
+
<modify-function signature="setMenuBar(QMenuBar*)">
- <modify-argument index="1">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
+ <inject-code class="target" position="beginning">
+ <insert-template name="replace_child">
+ <replace from="$FUNCTION_GET_OLD" to="menuBar" />
+ <replace from="$CHILD_TYPE" to="QMenuBar" />
+ <replace from="$PYARG" to="%PYARG_1" />
+ </insert-template>
+ </inject-code>
+ </modify-function>
+
<modify-function signature="setMenuWidget(QWidget*)">
- <modify-argument index="1">
- <parent index="this" action="add"/>
- </modify-argument>
+ <inject-code class="target" position="beginning">
+ <insert-template name="replace_child">
+ <replace from="$FUNCTION_GET_OLD" to="menuWidget" />
+ <replace from="$CHILD_TYPE" to="QWidget" />
+ <replace from="$PYARG" to="%PYARG_1" />
+ </insert-template>
+ </inject-code>
</modify-function>
+
<modify-function signature="setStatusBar(QStatusBar*)">
- <modify-argument index="1">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
- <modify-function signature="addDockWidget(Qt::DockWidgetArea, QDockWidget*)">
+ <inject-code class="target" position="beginning">
+ <insert-template name="replace_child">
+ <replace from="$FUNCTION_GET_OLD" to="statusBar" />
+ <replace from="$CHILD_TYPE" to="QStatusBar" />
+ <replace from="$PYARG" to="%PYARG_1" />
+ </insert-template>
+ </inject-code>
+ </modify-function>
+
+ <modify-function signature="addDockWidget(Qt::DockWidgetArea, QDockWidget*)">
<modify-argument index="2">
<parent index="this" action="add"/>
</modify-argument>
diff --git a/PySide/typesystem_templates.xml b/PySide/typesystem_templates.xml
index 3badcf273..46911fac7 100644
--- a/PySide/typesystem_templates.xml
+++ b/PySide/typesystem_templates.xml
@@ -1,5 +1,14 @@
<?xml version="1.0"?>
<typesystem>
+ <template name="replace_child">
+ $CHILD_TYPE* oldChild = %CPPSELF.$FUNCTION_GET_OLD();
+ if (oldChild) {
+ Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[$CHILD_TYPE*](oldChild));
+ Shiboken::setParent(NULL, pyChild);
+ }
+ Shiboken::setParent(%PYSELF, $PYARG);
+ </template>
+
<!-- Templates to fix bool* parameters -->
<template name="fix_bool*">
bool ok_;
diff --git a/tests/QtGui/qmainwindow_test.py b/tests/QtGui/qmainwindow_test.py
index fce145d53..372018cb3 100644
--- a/tests/QtGui/qmainwindow_test.py
+++ b/tests/QtGui/qmainwindow_test.py
@@ -17,6 +17,14 @@ class MainWindow(QtGui.QMainWindow):
pointerToolbar = self.addToolBar("Pointer type")
pointerToolbar.addWidget(pointerButton)
+class MyButton(QtGui.QPushButton):
+ def __init__(self, parent=None):
+ QtGui.QPushButton.__init__(self)
+ self._called = False
+
+ def myCallback(self):
+ self._called = True
+
class TestMainWindow(UsesQApplication):
@@ -26,6 +34,40 @@ class TestMainWindow(UsesQApplication):
QtCore.QTimer.singleShot(1000, self.app.quit)
self.app.exec_()
+ def testRefCountToNull(self):
+ w = QtGui.QMainWindow()
+ c = QtGui.QWidget()
+ self.assertEqual(sys.getrefcount(c), 2)
+ w.setCentralWidget(c)
+ self.assertEqual(sys.getrefcount(c), 3)
+ w.setCentralWidget(None)
+ self.assertEqual(sys.getrefcount(c), 2)
+
+ def testRefCountToAnother(self):
+ w = QtGui.QMainWindow()
+ c = QtGui.QWidget()
+ self.assertEqual(sys.getrefcount(c), 2)
+ w.setCentralWidget(c)
+ self.assertEqual(sys.getrefcount(c), 3)
+
+ c2 = QtGui.QWidget()
+ w.setCentralWidget(c2)
+ self.assertEqual(sys.getrefcount(c), 2)
+ self.assertEqual(sys.getrefcount(c2), 3)
+
+ def testSignalDisconect(self):
+ w = QtGui.QMainWindow()
+ b = MyButton("button")
+ b.clicked.connect(b.myCallback)
+ w.setCentralWidget(b)
+
+ b = MyButton("button")
+ b.clicked.connect(b.myCallback)
+ w.setCentralWidget(b)
+
+ b.click()
+ self.assertEqual(b._called, True)
+
if __name__ == '__main__':
unittest.main()