From 1b6337d8b4a65988dfbeb0eed67bc6584b25fdee Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Thu, 10 Jun 2010 19:57:18 -0300 Subject: Removed QVariant from PySide. Reviewer: Luciano Wolf Marcelo Lira --- PySide/QtCore/CMakeLists.txt | 1 - PySide/QtCore/qvariant_conversions.h | 147 +++++++++++------------ PySide/QtCore/typesystem_core.xml | 187 ++--------------------------- libpyside/pyside.cpp | 3 + libpyside/signalmanager.cpp | 25 ++-- libpyside/signalmanager.h | 14 +++ tests/QtCore/CMakeLists.txt | 2 - tests/QtCore/qabstracttransition_test.py | 7 +- tests/QtCore/qanimationgroup_test.py | 2 +- tests/QtCore/qobject_property_test.py | 66 ++++++---- tests/QtCore/qstate_test.py | 8 +- tests/QtCore/qvariant_pyobject_test.py | 68 ----------- tests/QtCore/qvariant_test.py | 124 ------------------- tests/QtGui/CMakeLists.txt | 1 - tests/QtGui/keep_reference_test.py | 4 +- tests/QtGui/qpixmap_test.py | 11 +- tests/QtGui/qvariant_test.py | 85 ------------- tests/QtSql/qsqldatabaseandqueries_test.py | 8 +- 18 files changed, 166 insertions(+), 597 deletions(-) delete mode 100644 tests/QtCore/qvariant_pyobject_test.py delete mode 100644 tests/QtCore/qvariant_test.py delete mode 100644 tests/QtGui/qvariant_test.py diff --git a/PySide/QtCore/CMakeLists.txt b/PySide/QtCore/CMakeLists.txt index bbe8ba7b5..12a2f4a50 100644 --- a/PySide/QtCore/CMakeLists.txt +++ b/PySide/QtCore/CMakeLists.txt @@ -120,7 +120,6 @@ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtimerevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtranslator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qurl_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/quuid_wrapper.cpp -${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qvariant_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwaitcondition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwritelocker_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamattribute_wrapper.cpp diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index aa6d521fb..076ed7f92 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -1,86 +1,83 @@ -// We use this thin wrapper instead of the plain PyObject pointer to avoid conflicts with specializations of T* -// in QVariant. -struct PyQt_PyObject -{ - PyObject* m_me; - PyQt_PyObject(PyObject* me) : m_me(me) {} - PyQt_PyObject() : m_me(Py_None) {} - operator PyObject*() { return m_me; } -}; - -Q_DECLARE_METATYPE(PyQt_PyObject) - namespace Shiboken { -inline bool Converter::checkType(PyObject* pyObj) +template<> +struct Converter { - return ValueTypeConverter::checkType(pyObj); -} + static bool checkType(PyObject* pyObj) + { + return false; // lets avoid the chaos + } -// all types are convertible to QVariant -inline bool Converter::isConvertible(PyObject* pyObj) -{ - return true; -} + // all types are convertible to QVariant + static bool isConvertible(PyObject* pyObj) + { + return true; + } -inline QVariant Converter::toCpp(PyObject* pyObj) -{ - if (SbkQVariant_Check(pyObj)) - return *Converter::toCpp(pyObj); + static QVariant toCpp(PyObject* pyObj) + { + using namespace Shiboken; - // Primitive types - if (PyBool_Check(pyObj)) { - // QVariant(bool) - return QVariant(Shiboken::Converter::toCpp(pyObj)); - } else if (PyString_CheckExact(pyObj)) { - // QVariant(const char*) - return QVariant(Shiboken::Converter::toCpp(pyObj)); - } else if (PyFloat_CheckExact(pyObj)) { - // QVariant(double) - return QVariant(Shiboken::Converter::toCpp(pyObj)); - } else if (PyInt_CheckExact(pyObj)) { - // QVariant(int) - return QVariant(Shiboken::Converter::toCpp(pyObj)); - } else if (PyLong_CheckExact(pyObj)) { - // QVariant(qlonglong) - return QVariant(Shiboken::Converter::toCpp(pyObj)); - } else if (Shiboken::isShibokenEnum(pyObj)) { - // QVariant(enum) - return QVariant(Shiboken::Converter::toCpp(pyObj)); - } else if (!Shiboken::isShibokenType(pyObj) || Shiboken::isUserType(pyObj)) { - // QVariant(User class) - Py_INCREF(pyObj); - return QVariant::fromValue(pyObj); - } else { - // a class supported by QVariant? - const char* typeName = pyObj->ob_type->tp_name; - // check if the name starts with PySide. - if (!strncmp("PySide.", typeName, 7)) { - // get the type name - const char* lastDot = typeName; - for (int i = 8; typeName[i]; ++i) { - if (typeName[i] == '.') - lastDot = &typeName[i]; - } - lastDot++; - uint typeCode = QMetaType::type(lastDot); - if (!typeCode) {// Try with star at end, for QObject*, QWidget* and QAbstractKinectScroller* - QString typeName(lastDot); - typeName += '*'; - typeCode = QMetaType::type(typeName.toAscii()); + // Primitive types + if (Converter::checkType(pyObj)) { + // QVariant(bool) + return QVariant(Converter::toCpp(pyObj)); + } else if (pyObj == Py_None) { + // QVariant() + return QVariant(); + } else if (Converter::checkType(pyObj)) { + // QVariant(const char*) + return QVariant(Converter::toCpp(pyObj)); + } else if (PyFloat_CheckExact(pyObj)) { + // QVariant(double) + return QVariant(Converter::toCpp(pyObj)); + } else if (PyInt_CheckExact(pyObj)) { + // QVariant(int) + return QVariant(Converter::toCpp(pyObj)); + } else if (PyLong_CheckExact(pyObj)) { + // QVariant(qlonglong) + return QVariant(Converter::toCpp(pyObj)); + } else if (Shiboken::isShibokenEnum(pyObj)) { + // QVariant(enum) + return QVariant(Converter::toCpp(pyObj)); + } else if (!isShibokenType(pyObj) || isUserType(pyObj)) { + // QVariant(User class) + return QVariant::fromValue(pyObj); + } else { + // a class supported by QVariant? + const char* typeName = pyObj->ob_type->tp_name; + // check if the name starts with PySide. + if (!strncmp("PySide.", typeName, 7)) { + // get the type name + const char* lastDot = typeName; + for (int i = 8; typeName[i]; ++i) { + if (typeName[i] == '.') + lastDot = &typeName[i]; + } + lastDot++; + uint typeCode = QMetaType::type(lastDot); + if (!typeCode) {// Try with star at end, for QObject*, QWidget* and QAbstractKinectScroller* + QString typeName(lastDot); + typeName += '*'; + typeCode = QMetaType::type(typeName.toAscii()); + } + if (typeCode) + return QVariant(typeCode, reinterpret_cast(pyObj)->cptr[0]); } - if (typeCode) - return QVariant(typeCode, reinterpret_cast(pyObj)->cptr[0]); + // Is a shiboken type not known by Qt + return QVariant::fromValue(pyObj); } - // Is a shiboken type not known by Qt - Py_INCREF(pyObj); - return QVariant::fromValue(pyObj); } -} - -inline PyObject* Converter::toPython(const QVariant& cppObj) -{ - return ValueTypeConverter::toPython(cppObj); -} + static PyObject* toPython(void* cppObj) { return toPython(*reinterpret_cast(cppObj)); } + static PyObject* toPython(const QVariant& cppObj) + { + if (cppObj.isValid()) { + Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(cppObj.typeName()); + if (tr) + return tr->toPython(const_cast(cppObj.data())); + } + Py_RETURN_NONE; + } +}; } diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 625886198..85694e4ec 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -74,7 +74,6 @@ - @@ -129,7 +128,10 @@ - + + + + @@ -154,6 +156,10 @@ + + + + @@ -248,7 +254,6 @@ - @@ -541,16 +546,6 @@ - - - - - - - - - - @@ -1241,172 +1236,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %0 = new %TYPE(%CONVERTTOCPP[QVariant](%PYARG_1)); - - - - - uint typeId = %CPPSELF.userType(); - if (typeId == qMetaTypeId<PyQt_PyObject>()) { - %PYARG_0 = %CPPSELF.value<PyQt_PyObject>(); - } else if (typeId == QVariant::String) { - %PYARG_0 = %CONVERTTOPYTHON[QString](%CPPSELF.toString()); - } else { - %PYARG_0 = Py_None; - Py_INCREF(Py_None); - } - - - - - if (%CPPSELF.isNull()) { - %PYARG_0 = Py_None; - Py_INCREF(Py_None); - } else if (%CPPSELF.userType() == qMetaTypeId<PyQt_PyObject>()) { - // emulate PyQt4 behaviour - PyObject* obj = %CPPSELF.value<PyQt_PyObject>(); - if (PySequence_Check(obj)) - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE]("QVariantList"); - } - if (!%PYARG_0) - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%CPPSELF.%FUNCTION_NAME()); - - - - - if (%CPPSELF.userType() == qMetaTypeId<PyQt_PyObject>()) { - PyObject* val = %CPPSELF.value<PyQt_PyObject>(); - if (PySequence_Check(val)) { - %PYARG_0 = val; - Py_INCREF(val); - } else { - %PYARG_0 = Py_None; - Py_INCREF(Py_None); - } - } else { - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%CPPSELF.%FUNCTION_NAME()); - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp index 3fa63a498..93271c8ba 100644 --- a/libpyside/pyside.cpp +++ b/libpyside/pyside.cpp @@ -34,6 +34,7 @@ #include "pyside.h" +#include "signalmanager.h" extern "C" void init_signal(PyObject* module); extern "C" void init_slot(PyObject* module); @@ -45,6 +46,8 @@ void init(PyObject *module) { init_signal(module); init_slot(module); + // Init signal manager, so it will register some meta types used by QVariant. + SignalManager::instance(); } } //namespace PySide diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 80d7254b7..7ac3f3067 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -54,35 +54,22 @@ #define PYTHON_TYPE "PyObject" - -// Use this to wrap PyObject during the Signal/Slot handling -struct PyObjectWrapper -{ - PyObject* m_me; - PyObjectWrapper(const PyObjectWrapper &other) : m_me(other.m_me) {} - PyObjectWrapper(PyObject* me) : m_me(me) { Py_INCREF(m_me); } - PyObjectWrapper() : m_me(Py_None) {} - operator PyObject*() const { return m_me; } -}; - -Q_DECLARE_METATYPE(PyObjectWrapper) - namespace Shiboken { template<> -struct Converter +struct Converter { - static PyObjectWrapper toCpp(PyObject* obj) + static PySide::PyObjectWrapper toCpp(PyObject* obj) { - return PyObjectWrapper(obj); + return PySide::PyObjectWrapper(obj); } static PyObject* toPython(void* obj) { - return toPython(*reinterpret_cast(obj)); + return toPython(*reinterpret_cast(obj)); } - static PyObject* toPython(const PyObjectWrapper& obj) + static PyObject* toPython(const PySide::PyObjectWrapper& obj) { return obj; } @@ -202,6 +189,8 @@ SignalManager::SignalManager() : m_d(new SignalManagerPrivate) qRegisterMetaType(PYTHON_TYPE); TypeResolver::createValueTypeResolver(PYTHON_TYPE); + TypeResolver::createValueTypeResolver("object"); + TypeResolver::createValueTypeResolver("PySide::PyObjectWrapper"); } void SignalManager::clear() diff --git a/libpyside/signalmanager.h b/libpyside/signalmanager.h index 233adf1ff..9687dcc3e 100644 --- a/libpyside/signalmanager.h +++ b/libpyside/signalmanager.h @@ -46,6 +46,17 @@ class QObject; namespace PySide { +/// Thin wrapper for PyObject which increases the reference count at the constructor but *NOT* at destructor. +class PYSIDE_API PyObjectWrapper +{ +public: + PyObjectWrapper(PyObject* me) : m_me(me) { Py_INCREF(m_me); } + PyObjectWrapper() : m_me(Py_None) { Py_INCREF(m_me); } + operator PyObject*() const { return m_me; } +private: + PyObject* m_me; +}; + PYSIDE_API bool isSignal(const char* signal); PYSIDE_API bool checkSignal(const char* signal); PYSIDE_API QString getCallbackSignature(const char* signal, PyObject* callback, bool encodeName); @@ -84,4 +95,7 @@ private: }; } + +Q_DECLARE_METATYPE(PySide::PyObjectWrapper) + #endif diff --git a/tests/QtCore/CMakeLists.txt b/tests/QtCore/CMakeLists.txt index cce1332ce..35fa7b97d 100644 --- a/tests/QtCore/CMakeLists.txt +++ b/tests/QtCore/CMakeLists.txt @@ -55,8 +55,6 @@ PYSIDE_TEST(qtimer_singleshot_test.py) PYSIDE_TEST(qtimer_timeout_test.py) PYSIDE_TEST(qtnamespace_test.py) PYSIDE_TEST(qurl_test.py) -PYSIDE_TEST(qvariant_pyobject_test.py) -PYSIDE_TEST(qvariant_test.py) PYSIDE_TEST(static_method_test.py) PYSIDE_TEST(static_protected_methods_test.py) PYSIDE_TEST(thread_signals_test.py) diff --git a/tests/QtCore/qabstracttransition_test.py b/tests/QtCore/qabstracttransition_test.py index 510b8ef64..4ba6d83e5 100644 --- a/tests/QtCore/qabstracttransition_test.py +++ b/tests/QtCore/qabstracttransition_test.py @@ -1,8 +1,7 @@ #!/usr/bin/python import unittest from sys import getrefcount -from PySide.QtCore import QObject, SIGNAL, QCoreApplication, QTimer, QVariant -from PySide.QtCore import QState, QFinalState, QStateMachine, QParallelAnimationGroup, QEventTransition +from PySide.QtCore import * def addStates(transition): sx = QState() @@ -19,11 +18,11 @@ class QAbstractTransitionTest(unittest.TestCase): app = QCoreApplication([]) o = QObject() - o.setProperty("text", QVariant("INdT")) + o.setProperty("text", "INdT") machine = QStateMachine() s1 = QState() - s1.assignProperty(o, "text", QVariant("Rocks")) + s1.assignProperty(o, "text", "Rocks") s2 = QFinalState() t = s1.addTransition(o, SIGNAL("change()"), s2) diff --git a/tests/QtCore/qanimationgroup_test.py b/tests/QtCore/qanimationgroup_test.py index 05bd81e10..58886d118 100644 --- a/tests/QtCore/qanimationgroup_test.py +++ b/tests/QtCore/qanimationgroup_test.py @@ -1,6 +1,6 @@ #!/usr/bin/python import unittest -from PySide.QtCore import QObject, QState, QFinalState, SIGNAL, QCoreApplication, QTimer, QStateMachine, QSignalTransition, QVariant, QParallelAnimationGroup, QSequentialAnimationGroup, QAnimationGroup +from PySide.QtCore import * class QAnimationGroupTest(unittest.TestCase): diff --git a/tests/QtCore/qobject_property_test.py b/tests/QtCore/qobject_property_test.py index d1f12b343..e94562c90 100644 --- a/tests/QtCore/qobject_property_test.py +++ b/tests/QtCore/qobject_property_test.py @@ -5,16 +5,24 @@ import unittest from PySide.QtCore import * +class Dummy(object): + '''Pure python sample class''' + pass + +class MySize(QSize): + '''Extended class''' + pass + class PropertyCase(unittest.TestCase): '''Test case for QObject properties''' def testObjectNameProperty(self): #QObject.setProperty() for existing C++ property obj = QObject() - self.assert_(obj.setProperty('objectName', QVariant('dummy'))) + self.assert_(obj.setProperty('objectName', 'dummy')) self.assertEqual(obj.objectName(), 'dummy') - self.assert_(obj.setProperty('objectName', QVariant('foobar'))) + self.assert_(obj.setProperty('objectName', 'foobar')) self.assertEqual(obj.objectName(), 'foobar') def testDynamicProperty(self): @@ -22,50 +30,66 @@ class PropertyCase(unittest.TestCase): obj = QObject() # Should return false when creating a new dynamic property - self.assert_(not obj.setProperty('dummy', QVariant('mydata'))) + self.assert_(not obj.setProperty('dummy', 'mydata')) prop = obj.property('dummy') - self.assert_(isinstance(prop, QVariant)) - self.assert_(prop.isValid()) - self.assertEqual(obj.property('dummy').toString(), 'mydata') + self.assert_(isinstance(prop, unicode)) + self.assertEqual(obj.property('dummy'), 'mydata') - self.assert_(not obj.setProperty('dummy', QVariant('zigzag'))) + self.assert_(not obj.setProperty('dummy', 'zigzag')) prop = obj.property('dummy') - self.assert_(isinstance(prop, QVariant)) - self.assert_(prop.isValid()) - self.assertEqual(obj.property('dummy').toString(), 'zigzag') + self.assert_(isinstance(prop, unicode)) + self.assertEqual(obj.property('dummy'), 'zigzag') - self.assert_(not obj.setProperty('dummy', QVariant(42))) + self.assert_(not obj.setProperty('dummy', 42)) prop = obj.property('dummy') - self.assert_(isinstance(prop, QVariant)) - self.assert_(prop.isValid()) + self.assert_(isinstance(prop, int)) # QVariant.toInt has a bool* arg in C++, so returns a tuple - self.assertEqual(obj.property('dummy').toInt(), (42, True)) + self.assertEqual(obj.property('dummy'), 42) def testStringProperty(self): obj = QObject() self.assert_(not obj.setProperty('dummy', 'data')) prop = obj.property('dummy') - self.assert_(isinstance(prop, QVariant)) - self.assert_(prop.isValid()) - self.assertEqual(obj.property('dummy').toString(), 'data') + self.assert_(isinstance(prop, unicode)) + self.assertEqual(obj.property('dummy'), 'data') def testImplicitQVariantProperty(self): obj = QObject() self.assert_(not obj.setProperty('dummy', 'data')) prop = obj.property('dummy') - self.assert_(isinstance(prop, QVariant)) - self.assert_(prop.isValid()) - self.assertEqual(obj.property('dummy').toString(), 'data') + self.assert_(isinstance(prop, unicode)) + self.assertEqual(obj.property('dummy'), 'data') def testInvalidProperty(self): #QObject.property() for invalid properties obj = QObject() prop = obj.property('dummy') - self.assert_(not prop.isValid()) + self.assertEqual(prop, None) + + def testTypeNamePythonClasses(self): + '''QVariant of pure python classes''' + d = Dummy() + obj = QObject() + obj.setProperty('foo', d) + # inherited type name from other binding + self.assertEqual(obj.property('foo'), d) + + def testQVariantPyList(self): + '''QVariant(QVariantList).toPyObject() equals original list''' + obj = QObject() + obj.setProperty('foo', [1, 'two', 3]) + self.assertEqual(obj.property('foo'), [1, 'two', 3]) + + def testSubClassConvertion(self): + '''QVariant(QSize subclass) type is UserType and returns same object''' + mysize = MySize(0, 0) + obj = QObject() + obj.setProperty('foo', mysize) + self.assertTrue(obj.property('foo') is mysize) if __name__ == '__main__': unittest.main() diff --git a/tests/QtCore/qstate_test.py b/tests/QtCore/qstate_test.py index d7c9a4c44..bee73e4ce 100644 --- a/tests/QtCore/qstate_test.py +++ b/tests/QtCore/qstate_test.py @@ -1,6 +1,6 @@ #!/usr/bin/python import unittest -from PySide.QtCore import QObject, QState, QFinalState, SIGNAL, QCoreApplication, QTimer, QStateMachine, QSignalTransition, QVariant +from PySide.QtCore import * class QStateTest(unittest.TestCase): @@ -8,11 +8,11 @@ class QStateTest(unittest.TestCase): app = QCoreApplication([]) o = QObject() - o.setProperty("text", QVariant("INdT")) + o.setProperty("text", "INdT") machine = QStateMachine() s1 = QState() - s1.assignProperty(o, "text", QVariant("Rocks")); + s1.assignProperty(o, "text", "Rocks"); s2 = QFinalState() t = s1.addTransition(o, SIGNAL("change()"), s2); @@ -28,7 +28,7 @@ class QStateTest(unittest.TestCase): QTimer.singleShot(100, app.quit) app.exec_() - txt = o.property("text").toString() + txt = o.property("text") self.assert_(txt, "Rocks") if __name__ == '__main__': diff --git a/tests/QtCore/qvariant_pyobject_test.py b/tests/QtCore/qvariant_pyobject_test.py deleted file mode 100644 index 2000a0199..000000000 --- a/tests/QtCore/qvariant_pyobject_test.py +++ /dev/null @@ -1,68 +0,0 @@ - -'''QVariant handling of PyObjects, including pure-python or derived from Qt''' - -import unittest - -from PySide.QtCore import * - - -class Dummy(object): - '''Pure python sample class''' - pass - -class MySize(QSize): - '''Extended class''' - pass - -class QVariantPurePython(unittest.TestCase): - '''QVariant + pure python classes''' - - def testTypeNamePythonClasses(self): - '''QVariant of pure python classes''' - d = Dummy() - obj = QVariant(d) - # inherited type name from other binding - self.assertEqual('PyQt_PyObject', obj.typeName()) - -class QVariantInheritedPython(unittest.TestCase): - '''QVariant + classes inherited from C++''' - - # This works only on PyQt4 4.5.x, not on PyQt4 4.4.x or PySide - def testSubClassConvertion(self): - '''QVariant(QSize subclass) type is UserType and returns same object''' - mysize = MySize(0, 0) - variant = QVariant(mysize) - - self.assertEqual(variant.type(), QVariant.UserType) - self.assertTrue(variant.toPyObject() is mysize) - - -class QVariantToPyObject(unittest.TestCase): - '''QVariant.toPyObject tests''' - - def testQVariantPyList(self): - '''QVariant(QVariantList).toPyObject() equals original list''' - obj = QVariant([1, 'two', 3]) - self.assertEqual(obj.toPyObject(), [1, 'two', 3]) - - def testPyObject(self): - '''QVariant(pure PyObject).toPyObject should return the same object''' - d = Dummy() - obj = QVariant(d) - self.assert_(d is obj.toPyObject()) - - def testNoneToPyObject(self): - '''QVariant().toPyObject() should return None''' - obj = QVariant() - self.assertEqual(None, obj.toPyObject()) - - def testQStringToPyObject(self): - '''QVariant(python string).toPyObject() return an equal QString''' - d = 'abc' - obj = QVariant('abc') - self.assert_(isinstance(obj.toPyObject(), unicode)) - self.assertEqual(d, obj.toPyObject()) - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/QtCore/qvariant_test.py b/tests/QtCore/qvariant_test.py deleted file mode 100644 index 6be7b8102..000000000 --- a/tests/QtCore/qvariant_test.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -'''Test cases for QVariant''' - -import unittest -import sys - -from PySide.QtCore import * - - -class QVariantToNumber(unittest.TestCase): - '''QVariant of number types''' - - def testToNumberInt(self): - '''QVariant(int).toInt()''' - obj = QVariant('37') - self.assertEqual((37, True), obj.toInt()) - - def testToNumberLongLong(self): - '''QVariant(int).toLongLong()''' - obj = QVariant('37') - self.assertEqual((37, True), obj.toLongLong()) - - def testToNumberUInt(self): - '''QVariant(int).toUInt()''' - obj = QVariant('37') - self.assertEqual((37, True), obj.toUInt()) - - def testToNumberUIntNegative(self): - '''QVariant(negative int).toUInt()''' - obj = QVariant('-37') - self.assert_(not obj.toUInt()[1]) - - def testToNumberULongLong(self): - '''QVariant(int).toULongLong()''' - obj = QVariant('37') - self.assertEqual((37, True), obj.toULongLong()) - - def testToNumberULongLongNegative(self): - '''QVariant(negative int).toULongLong()''' - obj = QVariant('-37') - self.assert_(not obj.toULongLong()[1]) - - def testToNumberFloat(self): - '''QVariant(double).toFloat()''' - obj = QVariant('37.109') - self.assertEqual((37.109, True), obj.toDouble()) - - -class QVariantTypeName(unittest.TestCase): - '''QVariant.typeName()''' - - def testTypeNameString(self): - '''QVariant(PyString).typeName()''' - obj = QVariant('aaaa') - self.assertEqual('QString', obj.typeName()) - - def testTypeNameInt(self): - '''QVariant(int).typeName()''' - obj = QVariant(34) - self.assertEqual('int', obj.typeName()) - - def testTypeNameDouble(self): - '''QVariant(double).typeName()''' - obj = QVariant(3.14) - self.assertEqual('double', obj.typeName()) - - def testTypeNameBool(self): - '''QVariant(bool).typeName()''' - obj = QVariant(True) - self.assertEqual('bool', obj.typeName()) - - def testTypeNameQByteArray(self): - '''QVariant(QByteArray).typeName()''' - obj = QVariant(QByteArray('aaaa')) - self.assertEqual('QByteArray', obj.typeName()) - - def testTypeNameNone(self): - '''QVariant().typeName()''' - obj = QVariant() - self.assertEqual(None, obj.typeName()) - - def testTypeNameQVariantList(self): - '''QVariant(QVariantList).typeName()''' - obj = QVariant([1, 2, 3, 4]) - self.assertEqual('QVariantList', obj.typeName()) - - obj = QVariant([1.0, 2.2, 3.3, 4.2]) - self.assertEqual('QVariantList', obj.typeName()) - - obj = QVariant(['aaa', 'bbb', 'ccc', 'dddd']) - self.assertEqual('QVariantList', obj.typeName()) - -class QVariantConstructor(unittest.TestCase): - '''More qvariant constructions''' - - def testCopyConstructor(self): - '''QVariant copy constructor''' - obj = QVariant(1) - cpy = QVariant(obj) - - self.assertEqual(obj.type(), cpy.type()) - - def testQStringConstructor(self): - '''QVariant(PyString).type == QVariant.string''' - obj = QVariant("PySide") - self.assertEqual(obj.type(), QVariant.String) - - def testQSizeConstructor(self): - '''QVariant(QSize).type == QVariant.Size''' - mysize = QSize(0, 0) - variant = QVariant(mysize) - - self.assertEqual(variant.type(), QVariant.Size) - self.assertEqual(variant.toSize(), mysize) - - def testToList(self): - v = QVariant((1,2,3)) - self.assertEqual(v.toList(), (1, 2, 3)) - v = QVariant([0,1,2]) - self.assertEqual(v.toList(), [0, 1, 2]) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/QtGui/CMakeLists.txt b/tests/QtGui/CMakeLists.txt index fa5de4a2c..d2d89ee98 100644 --- a/tests/QtGui/CMakeLists.txt +++ b/tests/QtGui/CMakeLists.txt @@ -46,7 +46,6 @@ PYSIDE_TEST(qtabwidget_test.py) PYSIDE_TEST(qtextedit_test.py) PYSIDE_TEST(qtoolbar_test.py) PYSIDE_TEST(qtoolbox_test.py) -PYSIDE_TEST(qvariant_test.py) PYSIDE_TEST(qwidget_setlayout_test.py) PYSIDE_TEST(qwidget_test.py TRUE) #Bug 237 PYSIDE_TEST(reference_count_test.py) diff --git a/tests/QtGui/keep_reference_test.py b/tests/QtGui/keep_reference_test.py index d0962d5df..310361a4a 100644 --- a/tests/QtGui/keep_reference_test.py +++ b/tests/QtGui/keep_reference_test.py @@ -4,7 +4,7 @@ import unittest from sys import getrefcount from helper import UsesQApplication -from PySide.QtCore import QAbstractTableModel, QVariant +from PySide.QtCore import * from PySide.QtGui import QTableView class TestModel(QAbstractTableModel): @@ -15,7 +15,7 @@ class TestModel(QAbstractTableModel): def columnCount(self, parent): return 0 def data(self, index, role): - return QVariant() + return None class KeepReferenceTest(UsesQApplication): diff --git a/tests/QtGui/qpixmap_test.py b/tests/QtGui/qpixmap_test.py index 7ba7454d4..1a0339f68 100644 --- a/tests/QtGui/qpixmap_test.py +++ b/tests/QtGui/qpixmap_test.py @@ -7,9 +7,10 @@ from PySide.QtCore import * class QPixmapTest(UsesQApplication): def testQVariantConstructor(self): + obj = QObject() pixmap = QPixmap() - v = QVariant(pixmap) - pixmap_copy = QPixmap(v) + obj.setProperty('foo', pixmap) + self.assertEqual(type(obj.property('foo')), QPixmap) def testQSizeConstructor(self): pixmap = QPixmap(QSize(10,20)) @@ -18,12 +19,6 @@ class QPixmapTest(UsesQApplication): def testQStringConstructor(self): pixmap = QPixmap("Testing!") - def testQVariantConstructor2(self): - v = QVariant(QPixmap()) - pixmap2 = QPixmap(v) - v = QVariant(QImage()) - pixmap2 = QPixmap(v) - def testQPixmapLoadFromDataWithQFile(self): f = QFile(os.path.join(os.path.dirname(__file__), 'sample.png')) self.assert_(f.open(QIODevice.ReadOnly)) diff --git a/tests/QtGui/qvariant_test.py b/tests/QtGui/qvariant_test.py deleted file mode 100644 index 138e43291..000000000 --- a/tests/QtGui/qvariant_test.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -'''Test cases for QVariant with QtGui types''' - -import unittest - -from PySide.QtCore import * -from PySide.QtGui import * - -from helper import UsesQApplication - -class Dummy(object): - pass - -class QVariantTypeName(unittest.TestCase): - def testQPen(self): - obj = QVariant(QPen(Qt.red)) - self.assertEqual('QPen', obj.typeName()) - - def testQColor(self): - obj = QVariant(QColor(Qt.red)) - self.assertEqual('QColor', obj.typeName()) - - def testGlobalColor(self): - obj = QVariant(Qt.red) - # XXX: PyQt4 returns int instead of QColor like the C++ version - self.assertEqual('QColor', obj.typeName()) - - def testEnums(self): - obj = QVariant(Qt.SolidLine) - self.assertEqual('int', obj.typeName()) - -class QVariantQColorImplicitlyConvertion(unittest.TestCase): - def testConversions(self): - c1 = QColor(0, 0, 0) - v = QVariant(c1) - c2 = QColor(v) - self.assertEqual(c1, c2) - -class QVariantQPixmap(UsesQApplication): - '''QVariant(QPixmap)''' - - def testBasic(self): - '''QVariant(QPixmap)''' - pixmap = QPixmap(10,20) - pixmap.fill(Qt.blue) - variant = QVariant(pixmap) - - self.assertEqual(variant.typeName(), "QPixmap") - - def testQObject(self): - obj = QObject() - v = QVariant(obj) - self.assertEqual(v.typeName(), 'QObject*') - - def testQWidget(self): - obj = QWidget() - v = QVariant(obj) - self.assertEqual(v.typeName(), 'QWidget*') - -class MyColor(QColor): - pass - -class MyPrimitive(int): - pass - -class QVariantMess(unittest.TestCase): - def testMyColor(self): - c1 = MyColor() - v = QVariant(c1) - self.assertEqual(type(v.toPyObject()), MyColor) - - def testMyPrimitive(self): - p = MyPrimitive(3) - v = QVariant(p) - self.assertNotEqual(v.type(), QVariant.Int) - self.assertTrue(v.toPyObject() is p) - - def testMatrix2x2(self): - m = QMatrix2x2() - v = QVariant(m) - self.assertEqual('QMatrix2x2', v.typeName()) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/QtSql/qsqldatabaseandqueries_test.py b/tests/QtSql/qsqldatabaseandqueries_test.py index 2d5a0a3e8..7a9d30a42 100644 --- a/tests/QtSql/qsqldatabaseandqueries_test.py +++ b/tests/QtSql/qsqldatabaseandqueries_test.py @@ -39,16 +39,16 @@ class SqlDatabaseCreationDestructionAndQueries(unittest.TestCase): query.exec_("INSERT INTO person VALUES(101, 'George', 'Harrison')") query.prepare("INSERT INTO person (id, firstname, lastname) " "VALUES (:id, :firstname, :lastname)") - query.bindValue(":id", QVariant(102)) - query.bindValue(":firstname", QVariant("John")) - query.bindValue(":lastname", QVariant("Lennon")) + query.bindValue(":id", 102) + query.bindValue(":firstname", "John") + query.bindValue(":lastname", "Lennon") query.exec_() lastname = '' query.exec_("SELECT lastname FROM person where id=101") self.assertTrue(query.isActive()) query.next() - lastname = query.value(0).toString() + lastname = query.value(0) self.assertEqual(lastname, 'Harrison') if __name__ == '__main__': -- cgit v1.2.3