metaclassparser.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. Copyright 2017 Herik Lima de Castro and Marcelo Medeiros Eler
  3. Distributed under MIT license, or public domain if desired and
  4. recognized in your jurisdiction.
  5. See file LICENSE for detail.
  6. */
  7. #include "metaclassparser.h"
  8. CWF_BEGIN_NAMESPACE
  9. MetaClassParser::MetaClassParser(QObject *object, bool removeObjectName)
  10. {
  11. const QMetaObject *meta = object->metaObject();
  12. int total = meta->propertyCount();
  13. for (int i = 0; i < total; ++i) {
  14. QMetaProperty prop(meta->property(i));
  15. QString propertyType(prop.typeName());
  16. QString propertyName(prop.name());
  17. if (removeObjectName && propertyName == "objectName")
  18. continue;
  19. properties.insert(propertyType + " " + propertyName, prop);
  20. props.insert(QPair<QString, QString>(propertyType, propertyName), prop);
  21. }
  22. total = meta->methodCount();
  23. for (int i = 0; i < total; ++i) {
  24. QMetaMethod method(meta->method(i));
  25. QString returnType(method.typeName());
  26. std::tuple<QString, QString> signature(returnType, method.methodSignature());
  27. methods.insert(signature, method);
  28. }
  29. }
  30. QString MetaClassParser::getReturnType(const QString &methodName)
  31. {
  32. for (QMap<std::tuple<QString, QString>, QMetaMethod>::iterator it = methods.begin();
  33. it != methods.end();
  34. ++it) {
  35. const QString &name = std::get<1>(it.key());
  36. if (name == methodName) {
  37. return std::get<0>(it.key());
  38. }
  39. }
  40. return "";
  41. }
  42. QString MetaClassParser::getParameterType(const QString &methodName)
  43. {
  44. for (QMap<std::tuple<QString, QString>, QMetaMethod>::iterator it = methods.begin();
  45. it != methods.end();
  46. ++it) {
  47. const QString &name = std::get<1>(it.key());
  48. if (name.startsWith(methodName + "(")) {
  49. return it.value()
  50. .methodSignature()
  51. .replace(methodName.toUtf8(), "")
  52. .replace("(", "")
  53. .replace(")", "");
  54. }
  55. }
  56. return "";
  57. }
  58. QStringList MetaClassParser::getAllPropertiesNames() const
  59. {
  60. QStringList temp;
  61. temp.reserve(props.size());
  62. for (const auto &it : props.keys()) {
  63. temp.push_back(it.second);
  64. }
  65. return temp;
  66. }
  67. QMetaProperty MetaClassParser::findProperty(const QString &propertyName)
  68. {
  69. for (auto it = props.begin(); it != props.end(); ++it) {
  70. if (it.key().second == propertyName)
  71. return it.value();
  72. }
  73. return {};
  74. }
  75. void *MetaClassParser::instantiateClassByName(const QByteArray &name)
  76. {
  77. int id = QMetaType::type(name);
  78. if (id != 0)
  79. return QMetaType::create(id);
  80. return nullptr;
  81. }
  82. CWF_END_NAMESPACE