diff options
Diffstat (limited to 'sources/pyside2')
-rw-r--r-- | sources/pyside2/libpyside/pyside.cpp | 44 | ||||
-rw-r--r-- | sources/pyside2/libpyside/pyside.h | 4 | ||||
-rw-r--r-- | sources/pyside2/libpyside/pysidestaticstrings.cpp | 6 | ||||
-rw-r--r-- | sources/pyside2/libpyside/pysidestaticstrings.h | 6 | ||||
-rw-r--r-- | sources/pyside2/tests/pysidetest/constructor_properties_test.py | 34 |
5 files changed, 66 insertions, 28 deletions
diff --git a/sources/pyside2/libpyside/pyside.cpp b/sources/pyside2/libpyside/pyside.cpp index 219b99d48..297e5a3b2 100644 --- a/sources/pyside2/libpyside/pyside.cpp +++ b/sources/pyside2/libpyside/pyside.cpp @@ -121,38 +121,36 @@ static bool _setProperty(PyObject *qObj, PyObject *name, PyObject *value, bool * return true; } -bool fillQtProperties(PyObject *qObj, const QMetaObject *metaObj, PyObject *kwds, const char **blackList, unsigned int blackListSize) +bool fillQtProperties(PyObject *qObj, const QMetaObject *metaObj, PyObject *kwds) { PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kwds, &pos, &key, &value)) { - if (!blackListSize || !std::binary_search(blackList, blackList + blackListSize, std::string(Shiboken::String::toCString(key)))) { - QByteArray propName(Shiboken::String::toCString(key)); - bool accept = false; - if (metaObj->indexOfProperty(propName) != -1) { - if (!_setProperty(qObj, key, value, &accept)) - return false; - } else { - propName.append("()"); - if (metaObj->indexOfSignal(propName) != -1) { - accept = true; - propName.prepend('2'); - if (!PySide::Signal::connect(qObj, propName, value)) - return false; - } - } - if (!accept) { - // PYSIDE-1019: Allow any existing attribute in the constructor. - if (!_setProperty(qObj, key, value, &accept)) + QByteArray propName(Shiboken::String::toCString(key)); + bool accept = false; + if (metaObj->indexOfProperty(propName) != -1) { + if (!_setProperty(qObj, key, value, &accept)) + return false; + } else { + propName.append("()"); + if (metaObj->indexOfSignal(propName) != -1) { + accept = true; + propName.prepend('2'); + if (!PySide::Signal::connect(qObj, propName, value)) return false; } - if (!accept) { - PyErr_Format(PyExc_AttributeError, "'%s' is not a Qt property or a signal", - propName.constData()); + } + if (!accept) { + // PYSIDE-1019: Allow any existing attribute in the constructor. + if (!_setProperty(qObj, key, value, &accept)) return false; - } + } + if (!accept) { + PyErr_Format(PyExc_AttributeError, "'%s' is not a Qt property or a signal", + propName.constData()); + return false; } } return true; diff --git a/sources/pyside2/libpyside/pyside.h b/sources/pyside2/libpyside/pyside.h index c1a298cc8..a465fec47 100644 --- a/sources/pyside2/libpyside/pyside.h +++ b/sources/pyside2/libpyside/pyside.h @@ -71,12 +71,10 @@ inline Py_ssize_t hash(const T& value) * Fill QObject properties and do signal connections using the values found in \p kwds dictonary. * \param qObj PyObject fot the QObject. * \param metaObj QMetaObject of \p qObj. - * \param blackList keys to be ignored in kwds dictionary, this string list MUST be sorted. - * \param blackListSize numbe rof elements in blackList. * \param kwds key->value dictonary. * \return True if everything goes well, false with a Python error setted otherwise. */ -PYSIDE_API bool fillQtProperties(PyObject *qObj, const QMetaObject *metaObj, PyObject *kwds, const char **blackList, unsigned int blackListSize); +PYSIDE_API bool fillQtProperties(PyObject *qObj, const QMetaObject *metaObj, PyObject *kwds); /** * If the type \p T was registered on Qt meta type system with Q_DECLARE_METATYPE macro, this class will initialize diff --git a/sources/pyside2/libpyside/pysidestaticstrings.cpp b/sources/pyside2/libpyside/pysidestaticstrings.cpp index 760d77632..2dab2caa9 100644 --- a/sources/pyside2/libpyside/pysidestaticstrings.cpp +++ b/sources/pyside2/libpyside/pysidestaticstrings.cpp @@ -60,4 +60,10 @@ STATIC_STRING_IMPL(name, "name") STATIC_STRING_IMPL(property, "property") STATIC_STRING_IMPL(select_id, "select_id") } // namespace PyName +namespace PyMagicName +{ +STATIC_STRING_IMPL(doc, "__doc__") +STATIC_STRING_IMPL(name, "__name__") +STATIC_STRING_IMPL(property_methods, "__property_methods__") +} // namespace PyMagicName } // namespace PySide diff --git a/sources/pyside2/libpyside/pysidestaticstrings.h b/sources/pyside2/libpyside/pysidestaticstrings.h index 1222d8f47..54d1ab9cd 100644 --- a/sources/pyside2/libpyside/pysidestaticstrings.h +++ b/sources/pyside2/libpyside/pysidestaticstrings.h @@ -55,6 +55,12 @@ PyObject *name(); PyObject *property(); PyObject *select_id(); } // namespace PyName +namespace PyMagicName +{ +PyObject *doc(); +PyObject *name(); +PyObject *property_methods(); +} // namespace PyMagicName } // namespace PySide #endif // PYSIDESTRINGS_H diff --git a/sources/pyside2/tests/pysidetest/constructor_properties_test.py b/sources/pyside2/tests/pysidetest/constructor_properties_test.py index 139091fed..5d1027048 100644 --- a/sources/pyside2/tests/pysidetest/constructor_properties_test.py +++ b/sources/pyside2/tests/pysidetest/constructor_properties_test.py @@ -47,11 +47,13 @@ init_test_paths(False) from helper.usesqapplication import UsesQApplication from PySide2.QtCore import Qt -from PySide2.QtWidgets import QApplication, QLabel, QFrame +from PySide2.QtGui import QColor +from PySide2.QtWidgets import QAction, QApplication, QFrame, QLabel class ConstructorPropertiesTest(UsesQApplication): + # PYSIDE-1019: First property extension was support by the constructor. def testCallConstructor(self): label = QLabel( frameStyle=QFrame.Panel | QFrame.Sunken, @@ -65,6 +67,34 @@ class ConstructorPropertiesTest(UsesQApplication): )) +class DiverseKeywordsTest(UsesQApplication): + + def testDuplicateKeyword(self): + r, g, b, a = 1, 2, 3, 4 + with self.assertRaises(TypeError) as cm: + QColor(r, g, b, a, a=0) + self.assertTrue("multiple" in cm.exception.args[0]) + + # PYSIDE-1305: Handle keyword args correctly. + def testUndefinedKeyword(self): + r, g, b, a = 1, 2, 3, 4 + # From the jira issue: + with self.assertRaises(AttributeError) as cm: + QColor(r, g, b, a, alpha=0) + self.assertTrue("unsupported" in cm.exception.args[0]) + + # PYSIDE-1305: Handle keyword args correctly. + def testUndefinedConstructorKeyword(self): + # make sure that the given attribute lands in the constructor + x = QAction(autoRepeat=False) + self.assertEqual(x.autoRepeat(), False) + x = QAction(autoRepeat=True) + self.assertEqual(x.autoRepeat(), True) + # QAction derives from QObject, and so the missing attributes + # in the constructor are reported as AttributeError. + with self.assertRaises(AttributeError): + QAction(some_other_name=42) + + if __name__ == '__main__': unittest.main() - |