void getMeta(const QObject* object, QTextStream& output) { const auto metaObject = object->metaObject(); // properties const auto propertyCount = metaObject->propertyCount(); for (int i = 0; i < propertyCount; i++) { const auto property = metaObject->property(i); if (QString(property.typeName()).endsWith("*")) { const auto propertyObject = object->property(property.name()); getMeta(qvariant_cast<QObject*>(propertyObject), output); output << "Object" << " " << property.typeName() << " " << qPrintable(QString(metaObject->className()) + "::" + property.name()) << endl; } else { output << "Property" << " " << property.typeName() << " " << qPrintable(QString(metaObject->className()) + "::" + property.name()) << endl; } } // methods const auto methodCount = metaObject->methodCount(); for (int i = 0; i < methodCount; i++) { const auto method = metaObject->method(i); switch (method.methodType()) { case QMetaMethod::Slot: { if (method.access() == QMetaMethod::Public) { output << "Slot" << " " << method.typeName() << " " << qPrintable(QString(metaObject->className()) + "::" + method.methodSignature().constData()) << endl; } break; } case QMetaMethod::Signal: { output << "Signal" << " " << method.typeName() << " " << qPrintable(QString(metaObject->className()) + "::" + method.methodSignature().constData()) << endl; break; } default: { } } } }
/*! Returns the name of the given method. Example usage: \code QByteArray method = QxtMetaObject::methodName(" int foo ( int bar, double baz )"); // method is now "foo" \endcode */ QByteArray methodName(const char* method) { QByteArray name = methodSignature(method); const int idx = name.indexOf("("); if (idx != -1) name.truncate(idx); return name; }
WsRequestParameters::operator const QList<QPair<QString, QString> >() const { typedef QPair<QString,QString> Pair; QList<Pair> list; QMapIterator<QString, QString> i( m_map ); while (i.hasNext()) { i.next(); list += Pair( i.key(), i.value() ); } return ( list << Pair( "api_sig", methodSignature() ) ); }
LuaValue* LuaUnityExportMethodDescriptor::invokeInstanceMethod(LuaSession *session, LuaArgumentList arguments) { if (_instanceMethodHandler != NULL) { //编码参数列表 LuaObjectEncoder *encoder = new LuaObjectEncoder(session -> getContext()); encoder -> writeInt32((int)(arguments.size() - 1)); LuaArgumentList::iterator it = arguments.begin(); LuaObjectDescriptor *instance = (*it) -> toObject(); ++it; for (; it != arguments.end(); ++it) { LuaValue *value = *it; encoder -> writeObject(value); } //paramsBuffer的内容由C#端进行释放 std::string methodName = StringUtils::format("%s_%s", name().c_str(), methodSignature().c_str()); const void *paramsBuffer = encoder -> cloneBuffer(); void *returnBuffer = _instanceMethodHandler(session -> getContext() -> objectId(), typeDescriptor -> objectId(), (long long) instance -> getObject(), methodName.c_str(), paramsBuffer, encoder -> getBufferLength()); encoder -> release(); LuaValue *retValue = NULL; if (returnBuffer != NULL) { LuaObjectDecoder *decoder = new LuaObjectDecoder(session -> getContext(), returnBuffer); retValue = dynamic_cast<LuaValue *>(decoder -> readObject()); decoder -> release(); //释放C#中申请的内存 free(returnBuffer); } else { retValue = LuaValue::NilValue(); } return retValue; } return NULL; }
void EventManager::registerObject(QObject *object, Priority priority, const QString &methodPrefix, const QString &filterPrefix) { for(int i = object->metaObject()->methodOffset(); i < object->metaObject()->methodCount(); i++) { QString methodSignature(object->metaObject()->method(i).signature()); int eventType = findEventType(methodSignature, methodPrefix); if(eventType > 0) { Handler handler(object, i, priority); registeredHandlers()[eventType].append(handler); //qDebug() << "Registered event handler for" << methodSignature << "in" << object; } eventType = findEventType(methodSignature, filterPrefix); if(eventType > 0) { Handler handler(object, i, priority); registeredFilters()[eventType].append(handler); //qDebug() << "Registered event filterer for" << methodSignature << "in" << object; } } }
const QHash<QString, int> &BasicHandler::handlerHash() { if(!initDone) { for(int i = metaObject()->methodOffset(); i < metaObject()->methodCount(); i++) { QString methodSignature(metaObject()->method(i).signature()); if(methodSignature.startsWith("defaultHandler")) { defaultHandler = i; continue; } if(!methodSignature.startsWith("handle")) continue; methodSignature = methodSignature.section('(',0,0); // chop the attribute list methodSignature = methodSignature.mid(6); // strip "handle" _handlerHash[methodSignature] = i; } initDone = true; } return _handlerHash; }