aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrenatofilho <renato.filho@openbossa.org>2010-11-05 16:35:59 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:08:55 -0300
commitf847631ef08c1ea6ed80857b78e0d8fa51e4eb2b (patch)
tree7df9a9d7adbed8df572426455a33a25ee7079b2e
parent73576ee9b01f88a92c05f48da3189532fbdfb578 (diff)
Implemented support to dynamic slots on generated code.
Fixes bug #451. Reviewer: Luciano Wolf <luciano.wolf@openbossa.org> Hugo Parente Lima <hugo.pl@gmail.com>
-rw-r--r--generator/cppgenerator.cpp36
1 files changed, 29 insertions, 7 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp
index 0a1cd3155..77c34000f 100644
--- a/generator/cppgenerator.cpp
+++ b/generator/cppgenerator.cpp
@@ -168,12 +168,13 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *metaCl
s << "#include <pyside.h>" << endl;
}
- s << "#include <typeresolver.h>\n";
- s << "#include <typeinfo>\n";
+ s << "#include <typeresolver.h>" << endl;
+ s << "#include <typeinfo>" << endl;
if (usePySideExtensions()) {
if (metaClass->isQObject()) {
- s << "#include <signalmanager.h>\n";
- s << "#include <dynamicqmetaobject.h>\n";
+ s << "#include <signalmanager.h>" << endl;
+ s << "#include <dynamicqmetaobject.h>" << endl;
+ s << "#include <pysidemetafunction.h>" << endl;
}
}
@@ -3550,9 +3551,30 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, const AbstractMetaClass
{
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;
+ << INDENT << "if (QString(method.signature()).startsWith(cname)) {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "if (method.methodType() == QMetaMethod::Signal) {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "signalList.append(method);" << endl;
+ }
+ s << INDENT << "} else {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "PySideMetaFunction* func = PySide::MetaFunction::newObject(cppSelf, i);" << endl
+ << INDENT << "if (func) {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "PyObject_SetAttr(self, name, (PyObject*)func);" << endl
+ << INDENT << "return (PyObject*)func;" << endl;
+ }
+ s << INDENT << "}" << endl;
+ }
+ s << INDENT << "}" << endl;
+ }
+ s << INDENT << "}" << endl;
+
}
s << INDENT << "}" << endl
<< INDENT << "if (signalList.size() > 0) {" << endl;