diff options
author | Cristián Maureira-Fredes <Cristian.Maureira-Fredes@qt.io> | 2021-07-07 12:18:45 +0200 |
---|---|---|
committer | Cristián Maureira-Fredes <Cristian.Maureira-Fredes@qt.io> | 2021-08-12 16:15:38 +0200 |
commit | 0042bb2706697e5f15ee914f84e37964f0001381 (patch) | |
tree | d7628aee8d8716984e3a12d84bc8961551c4dc9c /sources | |
parent | 0c75c823b0c8e48f03fa0bb166b195bfa7d5f2e9 (diff) |
Add fallback case for QSettings.value
This includes a case where the passed type is not
a Python type, so we fallback to a QVariant type
as Qt/C++ does.
A 'TypeError' is raised if the Python type used
is not considered.
Added a couple of tests too.
Fixes: PYSIDE-1619
Change-Id: I5f2e277bb6ccbf9c3a1b23e79717c11ff7635ce5
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit 07b93a82afc22760f87a68fa9926dd316c4a0815)
Diffstat (limited to 'sources')
-rw-r--r-- | sources/pyside2/PySide2/glue/qtcore.cpp | 10 | ||||
-rw-r--r-- | sources/pyside2/tests/QtCore/qsettings_test.py | 16 |
2 files changed, 23 insertions, 3 deletions
diff --git a/sources/pyside2/PySide2/glue/qtcore.cpp b/sources/pyside2/PySide2/glue/qtcore.cpp index 902b76a40..e8fd163d3 100644 --- a/sources/pyside2/PySide2/glue/qtcore.cpp +++ b/sources/pyside2/PySide2/glue/qtcore.cpp @@ -58,7 +58,7 @@ if (kwds || numArgs > 1) { PyTypeObject *typeObj = reinterpret_cast<PyTypeObject*>(%PYARG_3); -if (typeObj) { +if (typeObj && !Shiboken::ObjectType::checkType(typeObj)) { if (typeObj == &PyList_Type) { QByteArray out_ba = out.toByteArray(); if (!out_ba.isEmpty()) { @@ -104,8 +104,14 @@ if (typeObj) { Py_INCREF(Py_False); %PYARG_0 = Py_False; } + } else { + // TODO: PyDict_Type and PyTuple_Type + PyErr_SetString(PyExc_TypeError, + "Invalid type parameter.\n" + "\tUse 'list', 'bytes', 'str', 'int', 'float', 'bool', " + "or a Qt-derived type"); + return nullptr; } - // TODO: PyDict_Type and PyTuple_Type } else { if (!out.isValid()) { diff --git a/sources/pyside2/tests/QtCore/qsettings_test.py b/sources/pyside2/tests/QtCore/qsettings_test.py index a9f42a5d5..d7e203734 100644 --- a/sources/pyside2/tests/QtCore/qsettings_test.py +++ b/sources/pyside2/tests/QtCore/qsettings_test.py @@ -38,7 +38,7 @@ init_test_paths(False) from helper.helper import adjust_filename import py3kcompat as py3k -from PySide2.QtCore import QDir, QSettings, QTemporaryDir +from PySide2.QtCore import QDir, QSettings, QTemporaryDir, QByteArray class TestQSettings(unittest.TestCase): def testConversions(self): @@ -57,6 +57,20 @@ class TestQSettings(unittest.TestCase): r = settings.value('var2', type=list) self.assertEqual(type(r), list) + # Test mixed conversions + if py3k.IS_PY3K: + ba = QByteArray("hello".encode("utf-8")) + + r = settings.value("test", ba, type=QByteArray) + self.assertEqual(type(r), QByteArray) + + r = settings.value("test", ba, type=str) + self.assertEqual(type(r), str) + + # Test invalid conversions + with self.assertRaises(TypeError): + r = settings.value("test", ba, type=dict) + def testDefaultValueConversion(self): temp_dir = QDir.tempPath() |