From e80044aaca2f0769d65a18384df711006a519eb7 Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Mon, 20 Jun 2011 15:18:22 -0300 Subject: Implemented support to qt_metacast function on qobjects. fixs bug #872. Reviewer: Marcelo Lira Hugo Parente Lima --- generator/cppgenerator.cpp | 17 +++++++++++++++++ generator/cppgenerator.h | 1 + generator/headergenerator.cpp | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index 9e9c31ae9..ef019e9cc 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -949,6 +949,23 @@ void CppGenerator::writeMetaObjectMethod(QTextStream& s, const AbstractMetaClass s << INDENT << "int result = " << metaClass->qualifiedCppName() << "::qt_metacall(call, id, args);\n"; s << INDENT << "return result < 0 ? result : PySide::SignalManager::qt_metacall(this, call, id, args);\n"; s << "}\n\n"; + + // qt_metacast function + writeMetaCast(s, metaClass); +} + +void CppGenerator::writeMetaCast(QTextStream& s, const AbstractMetaClass* metaClass) +{ + Indentation indentation(INDENT); + QString wrapperClassName = wrapperName(metaClass); + s << "void* " << wrapperClassName << "::qt_metacast(const char* _clname)" << endl; + s << '{' << endl; + s << INDENT << "if (!_clname) return 0;" << endl; + s << INDENT << "SbkObject* pySelf = Shiboken::BindingManager::instance().retrieveWrapper(this);" << endl; + s << INDENT << "if (pySelf && PySide::inherits(pySelf->ob_type, _clname))" << endl; + s << INDENT << INDENT << "return static_cast(const_cast< " << wrapperClassName << "* >(this));" << endl; + s << INDENT << "return " << metaClass->qualifiedCppName() << "::qt_metacast(_clname);" << endl; + s << "}" << endl << endl; } void CppGenerator::writeConstructorWrapper(QTextStream& s, const AbstractMetaFunctionList overloads) diff --git a/generator/cppgenerator.h b/generator/cppgenerator.h index a5709ec52..185380e4b 100644 --- a/generator/cppgenerator.h +++ b/generator/cppgenerator.h @@ -46,6 +46,7 @@ private: void writeDestructorNative(QTextStream& s, const AbstractMetaClass* metaClass); void writeVirtualMethodNative(QTextStream& s, const AbstractMetaFunction* func); void writeMetaObjectMethod(QTextStream& s, const AbstractMetaClass* metaClass); + void writeMetaCast(QTextStream& s, const AbstractMetaClass* metaClass); void writeConstructorWrapper(QTextStream &s, const AbstractMetaFunctionList overloads); void writeDestructorWrapper(QTextStream& s, const AbstractMetaClass* metaClass); diff --git a/generator/headergenerator.cpp b/generator/headergenerator.cpp index 3b0de4fd3..3a8210366 100644 --- a/generator/headergenerator.cpp +++ b/generator/headergenerator.cpp @@ -133,7 +133,8 @@ void HeaderGenerator::generateClass(QTextStream& s, const AbstractMetaClass* met if ((!avoidProtectedHack() || !metaClass->hasPrivateDestructor()) && usePySideExtensions() && metaClass->isQObject()) { s << "public:\n"; - s << INDENT << "virtual int qt_metacall(QMetaObject::Call call, int id, void** args);\n"; + s << INDENT << "virtual int qt_metacall(QMetaObject::Call call, int id, void** args);" << endl; + s << INDENT << "virtual void* qt_metacast(const char* _clname);" << endl; } if (m_inheritedOverloads.size()) { -- cgit v1.2.3