diff options
author | Renato Araujo Oliveira Filho <renato.filho@openbossa.org> | 2010-12-15 17:52:29 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:47:58 -0300 |
commit | 22b74854195c888b82b1f246d87e16ea18b2c978 (patch) | |
tree | 9f10603159dce14365142e3613d9dacb2489c34a | |
parent | 0229e5413b18df40d76d152074e24a548fdbab69 (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>
-rw-r--r-- | libpyside/pyside.cpp | 50 | ||||
-rw-r--r-- | libpyside/pyside.h | 9 | ||||
-rw-r--r-- | tests/QtGui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/QtGui/bug_525.py | 21 |
4 files changed, 81 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 diff --git a/tests/QtGui/CMakeLists.txt b/tests/QtGui/CMakeLists.txt index 4bfb0d588..7cde60fec 100644 --- a/tests/QtGui/CMakeLists.txt +++ b/tests/QtGui/CMakeLists.txt @@ -20,6 +20,7 @@ PYSIDE_TEST(bug_467.py) PYSIDE_TEST(bug_480.py) PYSIDE_TEST(bug_500.py) PYSIDE_TEST(bug_512.py) +PYSIDE_TEST(bug_525.py) PYSIDE_TEST(customproxywidget_test.py) PYSIDE_TEST(deepcopy_test.py) PYSIDE_TEST(float_to_int_implicit_conversion_test.py) diff --git a/tests/QtGui/bug_525.py b/tests/QtGui/bug_525.py new file mode 100644 index 000000000..5e146ebe9 --- /dev/null +++ b/tests/QtGui/bug_525.py @@ -0,0 +1,21 @@ +import unittest +from PySide.QtGui import QApplication +from PySide.QtGui import QMenu + +class M2(QMenu): + def __init__(self,parent=None): + super(M2,self).__init__(parent) + self.setTitle(self.tr("M2")) + +class TestMenuDerivedClass(unittest.TestCase): + def aboutToShowHandler(self): + pass + + def testConnectSignal(self): + app = QApplication([]) + m2 = M2() + # Test if the aboutToShow signal was translated to correct type + m2.aboutToShow.connect(self.aboutToShowHandler) + +if __name__ == '__main__': + unittest.main() |