00001 #ifndef _PYTHONQT_H
00002 #define _PYTHONQT_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 "PythonQtSystem.h"
00046 #include "PythonQtWrapper.h"
00047 #include "PythonQtVariantWrapper.h"
00048 #include "PythonQtMetaObjectWrapper.h"
00049 #include "PythonQtSlot.h"
00050 #include "PythonQtObjectPtr.h"
00051 #include <QObject>
00052 #include <QVariant>
00053 #include <QList>
00054 #include <QHash>
00055 #include <QByteArray>
00056 #include <QStringList>
00057 #include <QtDebug>
00058 #include <iostream>
00059
00060
00061 class PythonQtClassInfo;
00062 class PythonQtPrivate;
00063 class PythonQtMethodInfo;
00064 class PythonQtSignalReceiver;
00065 class PythonQtImportFileInterface;
00066 class PythonQtCppWrapperFactory;
00067 class PythonQtConstructorHandler;
00068 class PythonQtQFileImporter;
00069
00070 typedef void PythonQtQObjectWrappedCB(QObject* object);
00071 typedef void PythonQtQObjectNoLongerWrappedCB(QObject* object);
00072
00074 class PYTHONQT_EXPORT PythonQt : public QObject {
00075
00076 Q_OBJECT
00077
00078 public:
00079 enum InitFlags {
00080 RedirectStdOut = 1,
00081 IgnoreSiteModule = 2,
00082 ExternalHelp = 4
00083 };
00084
00086 static void init(int flags = IgnoreSiteModule | RedirectStdOut);
00087
00089 static void cleanup();
00090
00092 static PythonQt* self() { return _self; }
00093
00094
00095
00096
00098 enum ObjectType {
00099 Class,
00100 Function,
00101 Variable,
00102 Module,
00103 Anything,
00104 CallOverloads
00105 };
00106
00108 void overwriteSysPath(const QStringList& paths);
00109
00111 void setModuleImportPath(PyObject* module, const QStringList& paths);
00112
00114 PythonQtObjectPtr getMainModule();
00115
00119
00120
00121 void registerClass(const QMetaObject* metaobject);
00122
00125 void registerQObjectClassNames(const QStringList& names);
00126
00129 void registerCPPClassNames(const QStringList& names);
00130
00132 PythonQtObjectPtr parseFile(const QString& filename);
00133
00136 QVariant evalCode(PyObject* module, PyObject* pycode);
00137
00139 QVariant evalScript(PyObject* module, const QString& script, int start = Py_file_input);
00140
00142 void evalFile(PyObject* module, const QString& filename);
00143
00148 PythonQtObjectPtr createModuleFromFile(const QString& name, const QString& filename);
00149
00154 PythonQtObjectPtr createModuleFromScript(const QString& name, const QString& script = QString());
00155
00158 PythonQtObjectPtr createUniqueModule();
00159
00161
00163 bool addSignalHandler(QObject* obj, const char* signal, PyObject* module, const QString& objectname);
00164
00166 bool removeSignalHandler(QObject* obj, const char* signal, PyObject* module, const QString& objectname);
00167
00169 bool addSignalHandler(QObject* obj, const char* signal, PyObject* receiver);
00170
00172 bool removeSignalHandler(QObject* obj, const char* signal, PyObject* receiver);
00173
00175
00177
00179 void addObject(PyObject* module, const QString& name, QObject* object);
00180
00182 void addVariable(PyObject* module, const QString& name, const QVariant& v);
00183
00185 void removeVariable(PyObject* module, const QString& name);
00186
00188 QVariant getVariable(PyObject* module, const QString& name);
00189
00191 QStringList introspection(PyObject* module, const QString& objectname, ObjectType type);
00192
00195 PythonQtObjectPtr lookupCallable(PyObject* module, const QString& name);
00196
00198
00200
00202 QVariant call(PyObject* module, const QString& callable, const QVariantList& args);
00203
00205
00207
00208
00213
00234 void addInstanceDecorators(QObject* o);
00235
00238
00252 void addClassDecorators(QObject* o);
00253
00255 void addDecorators(QObject* o);
00256
00259
00265 void addVariantWrapper(const char* typeName, QObject* wrapper);
00266
00268 void addWrapperFactory(PythonQtCppWrapperFactory* factory);
00269
00271 void addConstructorHandler(PythonQtConstructorHandler* handler);
00272
00274 const QList<PythonQtConstructorHandler*>& constructorHandlers();
00275
00277
00279
00289 void setImporter(PythonQtImportFileInterface* importInterface);
00290
00297 void installDefaultImporter() { setImporter(NULL); }
00298
00300 void setImporterIgnorePaths(const QStringList& paths);
00301
00303 const QStringList& getImporterIgnorePaths();
00304
00306
00308 static PythonQtPrivate* priv() { return _self->_p; }
00309
00311 static PythonQtImportFileInterface* importInterface();
00312
00315 bool handleError();
00316
00318 void setQObjectWrappedCallback(PythonQtQObjectWrappedCB* cb);
00320 void setQObjectNoLongerWrappedCallback(PythonQtQObjectNoLongerWrappedCB* cb);
00321
00323 static void qObjectNoLongerWrappedCB(QObject* o);
00324
00325 signals:
00327 void pythonStdOut(const QString& str);
00329 void pythonStdErr(const QString& str);
00330
00332 void pythonHelpRequest(const QByteArray& cppClassName);
00333
00334
00335 public:
00337 PyObject* helpCalled(PythonQtClassInfo* info);
00338
00341 PythonQtObjectPtr lookupObject(PyObject* module, const QString& name);
00342
00343 private:
00344 void initPythonQtModule(bool redirectStdOut);
00345
00347 static void stdOutRedirectCB(const QString& str);
00349 static void stdErrRedirectCB(const QString& str);
00350
00352 PythonQtSignalReceiver* getSignalReceiver(QObject* obj);
00353
00354 PythonQt(int flags);
00355 ~PythonQt();
00356
00357 static PythonQt* _self;
00358 static int _uniqueModuleCount;
00359
00360 PythonQtPrivate* _p;
00361
00362 };
00363
00365 class PythonQtPrivate : public QObject {
00366
00367 Q_OBJECT
00368
00369 public:
00370 PythonQtPrivate();
00371 ~PythonQtPrivate();
00372
00374 bool isPythonQtObjectPtrMetaId(int id) { return _PythonQtObjectPtr_metaId == id; }
00375
00377 void removeWrapperPointer(void* obj);
00378
00380 void removeSignalEmitter(QObject* obj);
00381
00383 PyObject* wrapQObject(QObject* obj);
00384
00386 PyObject* wrapPtr(void* ptr, const QByteArray& name);
00387
00389
00390
00391 void registerClass(const QMetaObject* metaobject);
00392
00395 void registerQObjectClassNames(const QStringList& names);
00396
00398 void addDecorators(QObject* o, bool instanceDeco, bool classDeco);
00399
00401 void addVariantWrapper(const char* typeName, QObject* wrapper);
00402
00404 QList<PythonQtSlotInfo*> getDecoratorSlots(const QByteArray& className);
00405
00408 bool isEnumType(const QMetaObject* meta, const QByteArray& name);
00409
00411 PythonQtMetaObjectWrapper* createNewPythonQtMetaObjectWrapper(PythonQtClassInfo* info);
00412
00414 PythonQtWrapper* createNewPythonQtWrapper(QObject* obj, PythonQtClassInfo* info, void* wrappedPtr = NULL);
00415
00417 PythonQtVariantWrapper* createNewPythonQtVariantWrapper(const QVariant& variant);
00418
00420 PythonQtClassInfo* getClassInfo(const QMetaObject* meta) { return _knownQtClasses.value(meta->className()); }
00421
00423 PythonQtSlotInfo* getConstructorSlot(const QByteArray& className) { return _constructorSlots.value(className); }
00424
00426 PythonQtSlotInfo* getDestructorSlot(const QByteArray& className) { return _destructorSlots.value(className); }
00427
00429 PythonQtObjectPtr createModule(const QString& name, PyObject* pycode);
00430
00431 private:
00432
00434 PythonQtWrapper* findWrapperAndRemoveUnused(void* obj);
00435
00437 QHash<void* , PythonQtWrapper *> _wrappedObjects;
00438
00440 QHash<QByteArray, PythonQtClassInfo *> _knownQtClasses;
00441
00443 QHash<QByteArray, PythonQtClassInfo *> _knownQtWrapperClasses;
00444
00446 QMultiHash<QByteArray, PythonQtSlotInfo *> _knownQtDecoratorSlots;
00447
00449 QHash<QByteArray, bool> _knownQObjectClassNames;
00450
00452 QHash<QObject* , PythonQtSignalReceiver *> _signalReceivers;
00453
00455 PythonQtObjectPtr _pythonQtModule;
00456
00458 PythonQtImportFileInterface* _importInterface;
00459
00461 PythonQtQFileImporter* _defaultImporter;
00462
00463 PythonQtQObjectNoLongerWrappedCB* _noLongerWrappedCB;
00464 PythonQtQObjectWrappedCB* _wrappedCB;
00465
00466 QStringList _importIgnorePaths;
00467
00469 QList<PythonQtCppWrapperFactory*> _cppWrapperFactories;
00470
00472 QList<PythonQtConstructorHandler*> _constructorHandlers;
00473
00474 QHash<QByteArray , PythonQtSlotInfo *> _constructorSlots;
00475 QHash<QByteArray , PythonQtSlotInfo *> _destructorSlots;
00476
00477 QHash<int , QPair<PythonQtClassInfo*, QObject*> > _knownVariantWrappers;
00478
00479 PythonQtClassInfo* _qtNamespace;
00480
00481 int _initFlags;
00482 int _PythonQtObjectPtr_metaId;
00483
00484 friend class PythonQt;
00485 };
00486
00487 #endif