2010-03-23 23 views
6

Czy istnieje sposób na znalezienie instancji QMetaObject klasy, biorąc pod uwagę nazwę klasy? to, co lubię robić, to ładować obiekty z dysku, ale aby tak się stało, potrzebuję sposobu na odzyskanie instancji QMetaObject przy użyciu nazwy klasy, aby użyć obiektu QMetaObject do utworzenia instancji.Jak znaleźć instancję metamocytu Qt na podstawie nazwy klasy?

Odpowiedz

0

można przechowywać instancje metaklasa będą potrzebne w Hash lub mapą, a następnie pobrać je przez co nazwa przechowywać je pod

0

Dla Państwa przypadku odpowiednim rozwiązaniem może być przy użyciu Qt mechanizm wtyczek. Oferuje funkcjonalność do łatwego ładowania udostępnionej/dynamicznej biblioteki i sprawdzenia, czy zawiera implementację jakiegoś pożądanego interfejsu, jeśli tak - utwórz instancję. Szczegóły można znaleźć tutaj: How to Create Qt Plugins

1

Powinieneś być w stanie to zrobić z QMetaType. Aby Twoje typy były znane, możesz potrzebować Q_DECLARE_META_TYPE() i/lub qRegisterMetaType(). Następnie powinno działać mniej więcej tak, jak w tym przykładzie, z linku:

int id = QMetaType::type("MyClass"); 
if (id == 0) { 
    void *myClassPtr = QMetaType::construct(id); 
    ... 
    QMetaType::destroy(id, myClassPtr); 
    myClassPtr = 0; 
} 
1

Ostatnio miałem do czynienia z tym samym problemem. Potrzebowałem metaobiektu bez konieczności tworzenia instancji samej klasy. Najlepsze, co mogę zrobić, to stworzyć globalną/statyczną funkcję, która pobiera qmetaobject z podaniem nazwy klasy. Osiągnąłem to, używając 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; 
} 

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

Jeśli ktoś ma lepszą opcję, proszę podzielić się!

-1

Można również spojrzeć na funkcję: QMetaType::metaObjectForType który

powraca QMetaType :: meta obiekt na typ

Aktualizacja: To jest mój kod, to utworzyć klasę przez nazwę klasy . (Zauważ, że klasa musi być zarejestrowana qRegisterMetaType (lub jest QObject bazę)

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

Aktualizacja 2:. ja zapomniałem powiedzieć konstruktor yout class musi być oznaczona jako Q_INVOKABLE

Powiązane problemy