aboutsummaryrefslogtreecommitdiffstats
path: root/sources
diff options
context:
space:
mode:
authorCristián Maureira-Fredes <Cristian.Maureira-Fredes@qt.io>2021-07-07 12:18:45 +0200
committerCristián Maureira-Fredes <Cristian.Maureira-Fredes@qt.io>2021-08-12 16:15:38 +0200
commit0042bb2706697e5f15ee914f84e37964f0001381 (patch)
treed7628aee8d8716984e3a12d84bc8961551c4dc9c /sources
parent0c75c823b0c8e48f03fa0bb166b195bfa7d5f2e9 (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.cpp10
-rw-r--r--sources/pyside2/tests/QtCore/qsettings_test.py16
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()