aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2010-12-17 19:37:35 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:48:01 -0300
commit7771798cf27896c43054699c5f53468cd8bf14cf (patch)
tree1115cf02ac1b8c88ee14d24fca96c17d2831f44c /tests
parent05d011ccfa3ad442adb3639f9db87d49dd346299 (diff)
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>
Diffstat (limited to 'tests')
-rw-r--r--tests/pysidetest/CMakeLists.txt9
-rw-r--r--tests/pysidetest/delegatecreateseditor_test.py55
-rw-r--r--tests/pysidetest/testview.cpp20
-rw-r--r--tests/pysidetest/testview.h10
-rw-r--r--tests/pysidetest/typesystem_pysidetest.xml1
5 files changed, 88 insertions, 7 deletions
diff --git a/tests/pysidetest/CMakeLists.txt b/tests/pysidetest/CMakeLists.txt
index 7cf9e5668..4a4c27aa0 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 000000000..0054e7995
--- /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 22ef9ddb1..75620e0db 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 1a65ea459..76a6f00f5 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 cf7774ac6..9cc413039 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*)">