##// END OF EJS Templates
added support for kwargs on call() methods...
florianlink -
r189:91b62d374275
parent child
Show More
@@ -1007,21 +1007,21 QStringList PythonQt::introspectType(const QString& typeName, ObjectType type)
1007 1007 return results;
1008 1008 }
1009 1009
1010 QVariant PythonQt::call(PyObject* object, const QString& name, const QVariantList& args)
1010 QVariant PythonQt::call(PyObject* object, const QString& name, const QVariantList& args, const QVariantMap& kwargs)
1011 1011 {
1012 1012 PythonQtObjectPtr callable = lookupCallable(object, name);
1013 1013 if (callable) {
1014 return call(callable, args);
1014 return call(callable, args, kwargs);
1015 1015 } else {
1016 1016 return QVariant();
1017 1017 }
1018 1018 }
1019 1019
1020 QVariant PythonQt::call(PyObject* callable, const QVariantList& args)
1020 QVariant PythonQt::call(PyObject* callable, const QVariantList& args, const QVariantMap& kwargs)
1021 1021 {
1022 1022 QVariant r;
1023 1023 PythonQtObjectPtr result;
1024 result.setNewRef(callAndReturnPyObject(callable, args));
1024 result.setNewRef(callAndReturnPyObject(callable, args, kwargs));
1025 1025 if (result) {
1026 1026 r = PythonQtConv::PyObjToQVariant(result);
1027 1027 } else {
@@ -1030,31 +1030,54 QVariant PythonQt::call(PyObject* callable, const QVariantList& args)
1030 1030 return r;
1031 1031 }
1032 1032
1033 PyObject* PythonQt::callAndReturnPyObject(PyObject* callable, const QVariantList& args)
1033 PyObject* PythonQt::callAndReturnPyObject(PyObject* callable, const QVariantList& args, const QVariantMap& kwargs)
1034 1034 {
1035 1035 PyObject* result = NULL;
1036 1036 if (callable) {
1037 bool err = false;
1037 1038 PythonQtObjectPtr pargs;
1038 1039 int count = args.size();
1039 if (count>0) {
1040 if ((count > 0) || (kwargs.count() > 0)) { // create empty tuple if kwargs are given
1040 1041 pargs.setNewRef(PyTuple_New(count));
1041 }
1042 bool err = false;
1043 // transform QVariants to Python
1044 for (int i = 0; i < count; i++) {
1045 PyObject* arg = PythonQtConv::QVariantToPyObject(args.at(i));
1046 if (arg) {
1047 // steals reference, no unref
1048 PyTuple_SetItem(pargs, i,arg);
1049 } else {
1050 err = true;
1051 break;
1042
1043 // transform QVariant arguments to Python
1044 for (int i = 0; i < count; i++) {
1045 PyObject* arg = PythonQtConv::QVariantToPyObject(args.at(i));
1046 if (arg) {
1047 // steals reference, no unref
1048 PyTuple_SetItem(pargs, i,arg);
1049 } else {
1050 err = true;
1051 break;
1052 }
1052 1053 }
1053 1054 }
1054
1055 1055 if (!err) {
1056 PyErr_Clear();
1057 result = PyObject_CallObject(callable, pargs);
1056 if (kwargs.isEmpty()) {
1057 // do a direct call if we have no keyword arguments
1058 PyErr_Clear();
1059 result = PyObject_CallObject(callable, pargs);
1060 } else {
1061 // convert keyword arguments to Python
1062 PythonQtObjectPtr pkwargs;
1063 pkwargs.setNewRef(PyDict_New());
1064 QMapIterator<QString, QVariant> it(kwargs);
1065 while (it.hasNext()) {
1066 it.next();
1067 PyObject* arg = PythonQtConv::QVariantToPyObject(it.value());
1068 if (arg) {
1069 PyDict_SetItemString(pkwargs, it.key().toLatin1().constData(), arg);
1070 } else {
1071 err = true;
1072 break;
1073 }
1074 }
1075 if (!err) {
1076 // call with arguments and keyword arguments
1077 PyErr_Clear();
1078 result = PyObject_Call(callable, pargs, pkwargs);
1079 }
1080 }
1058 1081 }
1059 1082 }
1060 1083 return result;
@@ -356,13 +356,13 public:
356 356 //@{
357 357
358 358 //! call the given python \c callable in the scope of object, returns the result converted to a QVariant
359 QVariant call(PyObject* object, const QString& callable, const QVariantList& args = QVariantList());
359 QVariant call(PyObject* object, const QString& callable, const QVariantList& args = QVariantList(), const QVariantMap& kwargs = QVariantMap());
360 360
361 361 //! call the given python object, returns the result converted to a QVariant
362 QVariant call(PyObject* callable, const QVariantList& args = QVariantList());
362 QVariant call(PyObject* callable, const QVariantList& args = QVariantList(), const QVariantMap& kwargs = QVariantMap());
363 363
364 364 //! call the given python object, returns the result as new PyObject
365 PyObject* callAndReturnPyObject(PyObject* callable, const QVariantList& args = QVariantList());
365 PyObject* callAndReturnPyObject(PyObject* callable, const QVariantList& args = QVariantList(), const QVariantMap& kwargs = QVariantMap());
366 366
367 367 //@}
368 368
@@ -96,14 +96,14 QVariant PythonQtObjectPtr::getVariable(const QString& name)
96 96 }
97 97
98 98
99 QVariant PythonQtObjectPtr::call(const QString& callable, const QVariantList& args)
99 QVariant PythonQtObjectPtr::call(const QString& callable, const QVariantList& args, const QVariantMap& kwargs)
100 100 {
101 return PythonQt::self()->call(_object, callable, args);
101 return PythonQt::self()->call(_object, callable, args, kwargs);
102 102 }
103 103
104 QVariant PythonQtObjectPtr::call(const QVariantList& args)
104 QVariant PythonQtObjectPtr::call(const QVariantList& args, const QVariantMap& kwargs)
105 105 {
106 return PythonQt::self()->call(_object, args);
106 return PythonQt::self()->call(_object, args, kwargs);
107 107 }
108 108
109 109 bool PythonQtObjectPtr::fromVariant(const QVariant& variant)
@@ -47,6 +47,7
47 47 #include "PythonQtSystem.h"
48 48 #include <QVariant>
49 49 #include <QVariantList>
50 #include <QVariantMap>
50 51
51 52 //! a smart pointer that stores a PyObject pointer and that handles reference counting automatically
52 53 class PYTHONQT_EXPORT PythonQtObjectPtr
@@ -142,10 +143,10 public:
142 143 QVariant getVariable(const QString& name);
143 144
144 145 //! call the given python object (in the scope of the current object), returns the result converted to a QVariant
145 QVariant call(const QString& callable, const QVariantList& args = QVariantList());
146 QVariant call(const QString& callable, const QVariantList& args = QVariantList(), const QVariantMap& kwargs = QVariantMap());
146 147
147 148 //! call the contained python object directly, returns the result converted to a QVariant
148 QVariant call(const QVariantList& args = QVariantList());
149 QVariant call(const QVariantList& args = QVariantList(), const QVariantMap& kwargs = QVariantMap());
149 150
150 151 protected:
151 152
General Comments 0
You need to be logged in to leave comments. Login now