Как мне найти экземпляр метаобъекта Qt по имени класса? - PullRequest
6 голосов
/ 23 марта 2010

Есть ли способ найти экземпляр класса QMetaObject по имени класса? мне нравится загружать объекты с диска, но для этого мне нужен способ получить экземпляр QMetaObject, используя имя класса, чтобы использовать QMetaObject для создания экземпляра.

Ответы [ 5 ]

2 голосов
/ 21 сентября 2011

Вы должны быть в состоянии сделать это с QMetaType . Вам может потребоваться Q_DECLARE_META_TYPE() и / или qRegisterMetaType(), чтобы ваши типы были известны. Тогда это должно работать примерно так, как в этом примере по ссылке:

 int id = QMetaType::type("MyClass");
 if (id == 0) {
     void *myClassPtr = QMetaType::construct(id);
     ...
     QMetaType::destroy(id, myClassPtr);
     myClassPtr = 0;
 }
1 голос
/ 09 сентября 2015

Я недавно столкнулся с той же проблемой. Я нуждался в метаобъекте без необходимости создавать экземпляр самого класса. Лучшее, что я мог сделать, - это создать глобальную / статическую функцию, которая получает объект qmetaobject с указанным именем класса. Я добился этого с помощью QObject :: staticMetaObject.

QMetaObject GetMetaObjectByClassName(QString strClassName)
{
    QMetaObject metaObj;
    if (strClassName.compare("MyClass1") == 0)
    {
        metaObj = MyClass1::staticMetaObject;
    }
    else if (strClassName.compare("MyClass2") == 0)
    {
        metaObj = MyClass2::staticMetaObject;
    }
    else if (strClassName.compare("MyClass3") == 0)
    {
        metaObj = MyClass3::staticMetaObject;
    }
    else if (strClassName.compare("MyClass4") == 0)
    {
        metaObj = MyClass4::staticMetaObject;
    }
    else if (strClassName.compare("MyClass5") == 0)
    {
        metaObj = MyClass5::staticMetaObject;
    }

    // and so on, you get the idea ...

    return metaObj;
}

См .: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var

Если у кого-то есть лучший вариант, пожалуйста, поделитесь!

0 голосов
/ 31 октября 2015

Вы также можете взглянуть на функцию: QMetaType::metaObjectForType, которая

возвращает QMetaType :: metaObject для типа

Обновление : Это мой код, он создает класс по имени класса. (Обратите внимание, что класс должен быть зарегистрирован в qRegisterMetaType (или является базой QObject)

int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);

Обновление 2: Я забыл сказать. Конструктор класса Yout должен быть помечен как Q_INVOKABLE

0 голосов
/ 21 сентября 2011

Для вашего случая подходящим решением может быть использование механизма плагинов Qt. Он предлагает функциональность, позволяющую легко загружать разделяемую / динамическую библиотеку и проверять, содержит ли она реализацию какого-либо желаемого интерфейса, если это так - создать экземпляр. Подробности можно найти здесь: Как создавать плагины Qt

0 голосов
/ 07 апреля 2010

Вы можете сохранить экземпляры MetaClass, которые вам понадобятся, в Hash или Map, а затем извлечь их под любым именем, которое вы сохранили в

...