diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-12-17 19:37:35 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-12-20 17:54:09 -0300 |
commit | 14a5405837736160ca94a2707916e1bacced39cb (patch) | |
tree | 0c39a39ec1c325a7499e4add8a14509188ae6ef2 | |
parent | fbc06244e02967be1627b1effa61a96476384f7f (diff) | |
download | pyside-14a5405837736160ca94a2707916e1bacced39cb.tar.gz pyside-14a5405837736160ca94a2707916e1bacced39cb.tar.xz pyside-14a5405837736160ca94a2707916e1bacced39cb.zip |
Fixes bug #502.
The ownership of the editor returned by the Python override of
QAbstractItemDelegate.createEditor(...) is now transferred to C++.
A test was added to simulate the situation that triggers the bug,
instead of relying on an example with a view, model and editable cells.
See: http://bugs.openbossa.org/show_bug.cgi?id=502
Reviewed by Lauro Moura <lauro.neto@openbossa.org>
Reviewed by Renato Araújo <renato.filho@openbossa.org>
-rw-r--r-- | PySide/QtGui/typesystem_gui_common.xml | 3 | ||||
-rw-r--r-- | tests/pysidetest/CMakeLists.txt | 9 | ||||
-rw-r--r-- | tests/pysidetest/delegatecreateseditor_test.py | 55 | ||||
-rw-r--r-- | tests/pysidetest/testview.cpp | 20 | ||||
-rw-r--r-- | tests/pysidetest/testview.h | 10 | ||||
-rw-r--r-- | tests/pysidetest/typesystem_pysidetest.xml | 1 |
6 files changed, 91 insertions, 7 deletions
diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index cc27c4b..940f730 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -3047,6 +3047,9 @@ <modify-argument index="1"> <define-ownership owner="c++"/> </modify-argument> + <modify-argument index="return"> + <define-ownership class="native" owner="c++"/> + </modify-argument> </modify-function> </object-type> <object-type name="QTableWidgetItem" > diff --git a/tests/pysidetest/CMakeLists.txt b/tests/pysidetest/CMakeLists.txt index 7cf9e56..4a4c27a 100644 --- a/tests/pysidetest/CMakeLists.txt +++ b/tests/pysidetest/CMakeLists.txt @@ -32,8 +32,8 @@ set(GENERATOR_EXTRA_FLAGS --generatorSet=shiboken --enable-parent-ctor-heuristic add_custom_command(OUTPUT ${testbinding_SRC} COMMAND ${GENERATORRUNNER_BINARY} ${GENERATOR_EXTRA_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/global.h - --include-paths=${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR}${PATH_SEP}${QT_QTCORE_INCLUDE_DIR} - --typesystem-paths=${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${pyside_SOURCE_DIR}${PATH_SEP}${QtCore_SOURCE_DIR} + --include-paths=${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR}${PATH_SEP}${QT_QTCORE_INCLUDE_DIR}${PATH_SEP}${QT_QTGUI_INCLUDE_DIR} + --typesystem-paths=${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${pyside_SOURCE_DIR}${PATH_SEP}${QtCore_SOURCE_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR} --output-directory=${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_pysidetest.xml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} @@ -44,8 +44,11 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} + ${QT_QTGUI_INCLUDE_DIR} ${SHIBOKEN_INCLUDE_DIR} + ${pyside_SOURCE_DIR} ${QtCore_BINARY_DIR}/PySide/QtCore + ${QtGui_BINARY_DIR}/PySide/QtGui ${libpyside_SOURCE_DIR} ${PYTHON_INCLUDE_PATH}) @@ -63,12 +66,14 @@ target_link_libraries(testbinding ${PYTHON_LIBRARIES} ${SHIBOKEN_LIBRARY} ${QT_QTCORE_LIBRARY} + ${QT_QTGUI_LIBRARY} ${SBK_PYTHON_LIBRARIES}) add_dependencies(testbinding pyside QtCore libpyside pysidetest) PYSIDE_TEST(homonymoussignalandmethod_test.py) +PYSIDE_TEST(delegatecreateseditor_test.py) PYSIDE_TEST(modelview_test.py) PYSIDE_TEST(version_test.py) diff --git a/tests/pysidetest/delegatecreateseditor_test.py b/tests/pysidetest/delegatecreateseditor_test.py new file mode 100644 index 0000000..0054e79 --- /dev/null +++ b/tests/pysidetest/delegatecreateseditor_test.py @@ -0,0 +1,55 @@ +#!/usr/bin/python + +import unittest +from helper import UsesQApplication + +from testbinding import TestView +from PySide.QtCore import Qt +from PySide.QtGui import QAbstractItemDelegate, QComboBox + +id_text = 'This is me' + +class DelegateDoesntKeepReferenceToEditor(QAbstractItemDelegate): + def createEditor(self, parent, option, index): + comboBox = QComboBox(parent) + comboBox.addItem(id_text) + return comboBox + + +class DelegateKeepsReferenceToEditor(QAbstractItemDelegate): + def __init__(self, parent=None): + QAbstractItemDelegate.__init__(self, parent) + self.comboBox = QComboBox() + self.comboBox.addItem(id_text) + + def createEditor(self, parent, option, index): + self.comboBox.setParent(parent) + return self.comboBox + + +class EditorCreatedByDelegateTest(UsesQApplication): + + def testDelegateDoesntKeepReferenceToEditor(self): + view = TestView(None) + delegate = DelegateDoesntKeepReferenceToEditor() + view.setItemDelegate(delegate) + editor = view.getEditorWidgetFromItemDelegate() + self.assertEqual(type(editor), QComboBox) + self.assertEqual(editor.count(), 1) + self.assertEqual(editor.itemData(0, Qt.DisplayRole), id_text) + editor.metaObject() + + def testDelegateKeepsReferenceToEditor(self): + view = TestView(None) + delegate = DelegateKeepsReferenceToEditor() + view.setItemDelegate(delegate) + editor = view.getEditorWidgetFromItemDelegate() + self.assertEqual(type(editor), QComboBox) + self.assertEqual(editor.count(), 1) + self.assertEqual(editor.itemData(0, Qt.DisplayRole), id_text) + editor.metaObject() + + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/pysidetest/testview.cpp b/tests/pysidetest/testview.cpp index 22ef9dd..75620e0 100644 --- a/tests/pysidetest/testview.cpp +++ b/tests/pysidetest/testview.cpp @@ -1,12 +1,24 @@ #include "testview.h" -#include <QDebug> -#include <stdio.h> + +#include <QWidget> +#include <QAbstractListModel> +#include <QAbstractItemDelegate> QVariant TestView::getData() { QModelIndex index; - QVariant data = m_model->data(index); - return data; + return m_model->data(index); +} + +QWidget* +TestView::getEditorWidgetFromItemDelegate() const +{ + if (!m_delegate) + return 0; + + QModelIndex index; + QStyleOptionViewItem options; + return m_delegate->createEditor(0, options, index); } diff --git a/tests/pysidetest/testview.h b/tests/pysidetest/testview.h index 1a65ea4..76a6f00 100644 --- a/tests/pysidetest/testview.h +++ b/tests/pysidetest/testview.h @@ -2,12 +2,15 @@ #define TESTVIEW_H #include <QObject> -#include <QAbstractListModel> #ifdef pysidetest_EXPORTS #define PYSIDE_EXPORTS 1 #endif #include "pysidemacros.h" +class QWidget; +class QAbstractListModel; +class QAbstractItemDelegate; + class PYSIDE_API TestView : public QObject { Q_OBJECT @@ -15,8 +18,13 @@ public: TestView(QAbstractListModel* model, QObject* parent = 0) : QObject(parent), m_model(model) {} QAbstractListModel* model() { return m_model; } QVariant getData(); + + void setItemDelegate(QAbstractItemDelegate* delegate) { m_delegate = delegate; } + QWidget* getEditorWidgetFromItemDelegate() const; + private: QAbstractListModel* m_model; + QAbstractItemDelegate* m_delegate; }; #endif // TESTVIEW_H diff --git a/tests/pysidetest/typesystem_pysidetest.xml b/tests/pysidetest/typesystem_pysidetest.xml index cf7774a..9cc4130 100644 --- a/tests/pysidetest/typesystem_pysidetest.xml +++ b/tests/pysidetest/typesystem_pysidetest.xml @@ -1,6 +1,7 @@ <?xml version="1.0"?> <typesystem package="testbinding"> <load-typesystem name="typesystem_core.xml" generate="no" /> + <load-typesystem name="typesystem_gui.xml" generate="no"/> <object-type name="TestObject" /> <object-type name="TestView" > <modify-function signature="TestView(QAbstractListModel*,QObject*)"> |