aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@openbossa.org>2010-12-15 17:52:29 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:47:58 -0300
commit22b74854195c888b82b1f246d87e16ea18b2c978 (patch)
tree9f10603159dce14365142e3613d9dacb2489c34a /libpyside
parent0229e5413b18df40d76d152074e24a548fdbab69 (diff)
Created function used in PyObject getAttro.
Moved the code generated to a function in libpyside. Create unit test for bug #525. Reviewer: Hugo Parente Lima <hugo.pl@gmail.com> Marcelo Lira <marcelo.lira@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r--libpyside/pyside.cpp50
-rw-r--r--libpyside/pyside.h9
2 files changed, 59 insertions, 0 deletions
diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp
index 7442cfc61..da896ceab 100644
--- a/libpyside/pyside.cpp
+++ b/libpyside/pyside.cpp
@@ -28,6 +28,7 @@
#include "pysidesignal_p.h"
#include "pysideslot_p.h"
#include "pysidemetafunction_p.h"
+#include "pysidemetafunction.h"
#include "dynamicqmetaobject.h"
#include <basewrapper.h>
@@ -225,5 +226,54 @@ void initQObjectSubType(SbkObjectType* type, PyObject* args, PyObject* kwds)
mo->addProperty(propPair.first, propPair.second);
}
+PyObject* getMetaDataFromQObject(QObject* cppSelf, PyObject* self, PyObject* name)
+{
+ PyObject* attr = PyObject_GenericGetAttr(self, name);
+ if (attr && Property::isPropertyType(attr)) {
+ PyObject *value = Property::getValue(reinterpret_cast<PySideProperty*>(attr), self);
+ if (!value)
+ return 0;
+ Py_DECREF(attr);
+ Py_INCREF(value);
+ attr = value;
+ }
+
+ //mutate native signals to signal instance type
+ if (attr && PyObject_TypeCheck(attr, &PySideSignalType)) {
+ PyObject* signal = reinterpret_cast<PyObject*>(Signal::initialize(reinterpret_cast<PySideSignal*>(attr), name, self));
+ PyObject_SetAttr(self, name, reinterpret_cast<PyObject*>(signal));
+ return signal;
+ }
+
+ //search on metaobject (avoid internal attributes started with '__')
+ if (!attr && !QString(PyString_AS_STRING(name)).startsWith("__")) {
+ const QMetaObject* metaObject = cppSelf->metaObject();
+ QByteArray cname(PyString_AS_STRING(name));
+ cname += '(';
+ //signal
+ QList<QMetaMethod> signalList;
+ for(int i=0, i_max = metaObject->methodCount(); i < i_max; i++) {
+ QMetaMethod method = metaObject->method(i);
+ if (QString(method.signature()).startsWith(cname)) {
+ if (method.methodType() == QMetaMethod::Signal) {
+ signalList.append(method);
+ } else {
+ PySideMetaFunction* func = MetaFunction::newObject(cppSelf, i);
+ if (func) {
+ PyObject_SetAttr(self, name, (PyObject*)func);
+ return (PyObject*)func;
+ }
+ }
+ }
+ }
+ if (signalList.size() > 0) {
+ PyObject* pySignal = reinterpret_cast<PyObject*>(Signal::newObjectFromMethod(self, signalList));
+ PyObject_SetAttr(self, name, pySignal);
+ return pySignal;
+ }
+ }
+ return attr;
+}
+
} //namespace PySide
diff --git a/libpyside/pyside.h b/libpyside/pyside.h
index d84040d55..fae1b420f 100644
--- a/libpyside/pyside.h
+++ b/libpyside/pyside.h
@@ -93,6 +93,15 @@ PYSIDE_API void runCleanupFunctions();
*/
PYSIDE_API void destroyQCoreApplication();
+/**
+ * Check for properties and signals registered on MetaObject and return these
+ * \param cppSelf Is the QObject which contains the metaobject
+ * \param self Python object of cppSelf
+ * \param name Name of the argument which the function will try retrieve from MetaData
+ * \return The Python object which contains the Data obtained in metaObject or the Python attribute related with name
+ */
+PYSIDE_API PyObject* getMetaDataFromQObject(QObject* cppSelf, PyObject* self, PyObject* name);
+
} //namespace PySide