@@ -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 |
|
|
|
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