diff options
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 3 | ||||
-rw-r--r-- | PySide/QtGui/typesystem_gui_common.xml | 56 | ||||
-rw-r--r-- | PySide/typesystem_templates.xml | 9 | ||||
-rw-r--r-- | tests/QtGui/qmainwindow_test.py | 42 |
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() |