2010-03-23 37 views
6

有沒有辦法找到類的QMetaObject實例,給定類名?我喜歡做的是從磁盤加載對象,但爲了實現這一點,我需要一種方法來使用類的名稱來檢索QMetaObject實例,以便使用QMetaObject來創建一個實例。如何從類名稱中找到Qt元對象實例?

回答

0

您可以將元類的實例,你需要在一個哈希或地圖,然後通過什麼名字,你將它們存儲在

0

對於你的情況適合的解決方案可以使用Qt的插件機制檢索它們。它提供了輕鬆加載共享/動態庫的功能,並檢查它是否包含某個所需接口的實現(如果有的話) - 創建實例。詳情可以在這裏找到:How to Create Qt Plugins

1

你應該可以用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

我最近一直面臨同樣的問題。我需要元對象而不必創建類本身的一個實例。我能做的最好的事情是創建一個全局/靜態函數,該函數根據類名稱檢索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

如果有人有一個更好的選擇,歡迎交流!

-1

您還可以看看功能:QMetaType::metaObjectForType

回報QMetaType ::元對象類型

更新:這是我的代碼,它創建的類名稱的類。 (請注意,類必須與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

相關問題