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>
This commit is contained in:
parent
4284ae6cc6
commit
569d1ab60e
4 changed files with 92 additions and 18 deletions
|
|
@ -1049,6 +1049,9 @@
|
||||||
<modify-argument index="this">
|
<modify-argument index="this">
|
||||||
<parent index="return" action="add"/>
|
<parent index="return" action="add"/>
|
||||||
</modify-argument>
|
</modify-argument>
|
||||||
|
<modify-argument index="return">
|
||||||
|
<define-ownership class="target" owner="default"/>
|
||||||
|
</modify-argument>
|
||||||
</modify-function>
|
</modify-function>
|
||||||
<modify-function signature="setParent(QObject*)">
|
<modify-function signature="setParent(QObject*)">
|
||||||
<modify-argument index="this">
|
<modify-argument index="this">
|
||||||
|
|
|
||||||
|
|
@ -1260,12 +1260,12 @@
|
||||||
</modify-argument>
|
</modify-argument>
|
||||||
</modify-function>
|
</modify-function>
|
||||||
<modify-function signature="parentWidget() const">
|
<modify-function signature="parentWidget() const">
|
||||||
<modify-argument index="return">
|
|
||||||
<define-ownership owner="target"/>
|
|
||||||
</modify-argument>
|
|
||||||
<modify-argument index="this">
|
<modify-argument index="this">
|
||||||
<parent index="return" action="add"/>
|
<parent index="return" action="add"/>
|
||||||
</modify-argument>
|
</modify-argument>
|
||||||
|
<modify-argument index="return">
|
||||||
|
<define-ownership class="target" owner="default"/>
|
||||||
|
</modify-argument>
|
||||||
</modify-function>
|
</modify-function>
|
||||||
<modify-function signature="setMatrix(QMatrix, bool)" remove="all"/>
|
<modify-function signature="setMatrix(QMatrix, bool)" remove="all"/>
|
||||||
<modify-function signature="paint(QPainter*,const QStyleOptionGraphicsItem*,QWidget*)">
|
<modify-function signature="paint(QPainter*,const QStyleOptionGraphicsItem*,QWidget*)">
|
||||||
|
|
@ -1689,26 +1689,46 @@
|
||||||
</object-type>
|
</object-type>
|
||||||
<object-type name="QMainWindow">
|
<object-type name="QMainWindow">
|
||||||
<modify-function signature="setCentralWidget(QWidget*)">
|
<modify-function signature="setCentralWidget(QWidget*)">
|
||||||
<modify-argument index="1">
|
<inject-code class="target" position="beginning">
|
||||||
<parent index="this" action="add"/>
|
<insert-template name="replace_child">
|
||||||
</modify-argument>
|
<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>
|
||||||
|
|
||||||
<modify-function signature="setMenuBar(QMenuBar*)">
|
<modify-function signature="setMenuBar(QMenuBar*)">
|
||||||
<modify-argument index="1">
|
<inject-code class="target" position="beginning">
|
||||||
<parent index="this" action="add"/>
|
<insert-template name="replace_child">
|
||||||
</modify-argument>
|
<replace from="$FUNCTION_GET_OLD" to="menuBar" />
|
||||||
</modify-function>
|
<replace from="$CHILD_TYPE" to="QMenuBar" />
|
||||||
|
<replace from="$PYARG" to="%PYARG_1" />
|
||||||
|
</insert-template>
|
||||||
|
</inject-code>
|
||||||
|
</modify-function>
|
||||||
|
|
||||||
<modify-function signature="setMenuWidget(QWidget*)">
|
<modify-function signature="setMenuWidget(QWidget*)">
|
||||||
<modify-argument index="1">
|
<inject-code class="target" position="beginning">
|
||||||
<parent index="this" action="add"/>
|
<insert-template name="replace_child">
|
||||||
</modify-argument>
|
<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>
|
||||||
|
|
||||||
<modify-function signature="setStatusBar(QStatusBar*)">
|
<modify-function signature="setStatusBar(QStatusBar*)">
|
||||||
<modify-argument index="1">
|
<inject-code class="target" position="beginning">
|
||||||
<parent index="this" action="add"/>
|
<insert-template name="replace_child">
|
||||||
</modify-argument>
|
<replace from="$FUNCTION_GET_OLD" to="statusBar" />
|
||||||
</modify-function>
|
<replace from="$CHILD_TYPE" to="QStatusBar" />
|
||||||
<modify-function signature="addDockWidget(Qt::DockWidgetArea, QDockWidget*)">
|
<replace from="$PYARG" to="%PYARG_1" />
|
||||||
|
</insert-template>
|
||||||
|
</inject-code>
|
||||||
|
</modify-function>
|
||||||
|
|
||||||
|
<modify-function signature="addDockWidget(Qt::DockWidgetArea, QDockWidget*)">
|
||||||
<modify-argument index="2">
|
<modify-argument index="2">
|
||||||
<parent index="this" action="add"/>
|
<parent index="this" action="add"/>
|
||||||
</modify-argument>
|
</modify-argument>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,14 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<typesystem>
|
<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 -->
|
<!-- Templates to fix bool* parameters -->
|
||||||
<template name="fix_bool*">
|
<template name="fix_bool*">
|
||||||
bool ok_;
|
bool ok_;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,14 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
pointerToolbar = self.addToolBar("Pointer type")
|
pointerToolbar = self.addToolBar("Pointer type")
|
||||||
pointerToolbar.addWidget(pointerButton)
|
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):
|
class TestMainWindow(UsesQApplication):
|
||||||
|
|
||||||
|
|
@ -26,6 +34,40 @@ class TestMainWindow(UsesQApplication):
|
||||||
QtCore.QTimer.singleShot(1000, self.app.quit)
|
QtCore.QTimer.singleShot(1000, self.app.quit)
|
||||||
self.app.exec_()
|
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__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue