00001 #ifndef _PYTHONQTOBJECTPTR_H
00002 #define _PYTHONQTOBJECTPTR_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00043
00044
00045 #include <Python.h>
00046 #include "PythonQtSystem.h"
00047
00049 class PYTHONQT_EXPORT PythonQtObjectPtr
00050 {
00051 public:
00052 PythonQtObjectPtr():_object(NULL) {}
00053
00054 PythonQtObjectPtr(const PythonQtObjectPtr &p):_object(NULL) {
00055 setObject(p.object());
00056 }
00057
00059 PythonQtObjectPtr(const QVariant& variant):_object(NULL) {
00060 fromVariant(variant);
00061 }
00062
00063 PythonQtObjectPtr(PyObject* o) {
00064 _object = o;
00065 if (o) Py_INCREF(_object);
00066 }
00067
00068 ~PythonQtObjectPtr() { if (_object) Py_DECREF(_object); }
00069
00071 bool fromVariant(const QVariant& variant);
00072
00073 PythonQtObjectPtr &operator=(const PythonQtObjectPtr &p) {
00074 setObject(p.object());
00075 return *this;
00076 }
00077
00078 PythonQtObjectPtr &operator=(PyObject* o) {
00079 setObject(o);
00080 return *this;
00081 }
00082
00083
00084 PythonQtObjectPtr &operator=(const QVariant& variant) {
00085 fromVariant(variant);
00086 return *this;
00087 }
00088
00089
00090 bool operator==( const PythonQtObjectPtr &p ) const {
00091 return object() == p.object();
00092 }
00093
00094 bool operator!= ( const PythonQtObjectPtr& p ) const {
00095 return !( *this == p );
00096 }
00097
00098 bool operator==( PyObject* p ) const {
00099 return object() == p;
00100 }
00101
00102 bool operator!= ( PyObject* p ) const {
00103 return object() != p;
00104 }
00105
00106 bool isNull() const { return !object(); }
00107
00108 PyObject* operator->() const { return object(); }
00109
00110 PyObject& operator*() const { return *( object() ); }
00111
00112 operator PyObject*() const { return object(); }
00113
00115 void setNewRef(PyObject* o) {
00116 if (o != _object) {
00117 if (_object) Py_DECREF(_object);
00118 _object = o;
00119 }
00120 }
00121
00122 PyObject* object() const {
00123 return _object;
00124 }
00125
00127 QVariant evalScript(const QString& script, int start = Py_file_input);
00128
00131 QVariant evalCode(PyObject* pycode);
00132
00134 void evalFile(const QString& filename);
00135
00137 void addObject(const QString& name, QObject* object);
00138
00140 void addVariable(const QString& name, const QVariant& v);
00141
00143 void removeVariable(const QString& name);
00144
00146 QVariant getVariable(const QString& name);
00147
00149 QVariant call(const QString& callable, const QVariantList& args);
00150
00151
00152
00153
00154 protected:
00155
00156 void setObject(PyObject* o) {
00157 if (o != _object) {
00158 if (_object) Py_DECREF(_object);
00159 _object = o;
00160 if (_object) Py_INCREF(_object);
00161 }
00162 }
00163
00164 private:
00165 PyObject* _object;
00166 };
00167
00168
00169
00170 Q_DECLARE_METATYPE(PythonQtObjectPtr)
00171
00172 #endif