diff options
author | renatofilho <renato.filho@openbossa.org> | 2010-10-28 13:46:41 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:08:53 -0300 |
commit | 8a727dddc028c94807b85b9acd8c88dd276fd12a (patch) | |
tree | 01175ac3adad044e6f7c0fe4cee212b76f5d3a08 /generator | |
parent | 80c24e13a41f48440cecdb5cff20f250343515a9 (diff) |
Implemented support to dynamic signals created on QML side.
Fixes bug #437.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'generator')
-rw-r--r-- | generator/cppgenerator.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index 7f708d204..02ca2dda2 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -3556,7 +3556,7 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, const AbstractMetaClass s << INDENT << '}' << endl; } s << INDENT << "PyObject* attr = PyObject_GenericGetAttr(self, name);" << endl; - if (usePySideExtensions() && metaClass->isQObject()) { + if (usePySideExtensions() && (metaClass->qualifiedCppName() == "QObject")) { s << INDENT << "if (attr && PySide::isQPropertyType(attr)) {" << endl; { Indentation indent(INDENT); @@ -3571,7 +3571,39 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, const AbstractMetaClass s << INDENT << "attr = value;" << endl; } s << INDENT << "}" << endl; + + s << INDENT << "//search on metaobject (avoid internal attributes started with '__')" << endl + << INDENT << "if (!attr && !QString(PyString_AS_STRING(name)).startsWith(\"__\")) {" << endl; + { + Indentation indent(INDENT); + s << INDENT << "QObject* cppSelf = Converter<QObject*>::toCpp(self);" << endl + << INDENT << "const QMetaObject* metaObject = cppSelf->metaObject();" << endl + << INDENT << "QByteArray cname(PyString_AS_STRING(name));" << endl + << INDENT << "cname += '(';" << endl + << INDENT << "//signal" << endl + << INDENT << "QList<QMetaMethod> signalList;" << endl + << INDENT << "for(int i=0, i_max = metaObject->methodCount(); i < i_max; i++) {" << endl; + { + Indentation indent(INDENT); + s << INDENT << "QMetaMethod method = metaObject->method(i);" << endl + << INDENT << "if ((method.methodType() == QMetaMethod::Signal) &&" << endl + << INDENT << "QString(method.signature()).startsWith(cname))" << endl + << INDENT << "signalList.append(method);" << endl; + } + s << INDENT << "}" << endl + << INDENT << "if (signalList.size() > 0) {" << endl; + { + Indentation indent(INDENT); + s << INDENT << "PyObject* pySignal = PySide::signalNewFromMethod(self, signalList);" << endl + << INDENT << "PyObject_SetAttr(self, name, pySignal);" << endl + << INDENT << "PyObject_GenericSetAttr(self, name, pySignal);" << endl + << INDENT << "return pySignal;" << endl; + } + s << INDENT << "}" << endl; + } + s << INDENT << "}" << endl; } + s << INDENT << "return attr;" << endl; s << '}' << endl; } |