有沒有辦法找到類的QMetaObject實例,給定類名?我喜歡做的是從磁盤加載對象,但爲了實現這一點,我需要一種方法來使用類的名稱來檢索QMetaObject實例,以便使用QMetaObject來創建一個實例。如何從類名稱中找到Qt元對象實例?
6
A
回答
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
相關問題
- 1. 從類中找到的類的實例的名稱
- 2. 如何獲得類對象沒有實例或類名稱
- 3. 從類名稱中將對象實例化爲字符串
- 4. 從名稱實例化類?
- 5. 如何查找類中的類實例變量的名稱。
- 6. QT:獲取對象的類名稱
- 7. 如何基於對象名稱創建javascript對象的實例
- 8. 如何找到類的現有實例的名稱空間
- 9. 從QWidget獲取對象名稱(從Qt Designer中看到)?
- 10. 如何實例化給定類名稱和基類的對象命名空間
- 11. 將標籤(對象名稱)添加到實例對象
- 12. 類實例名稱
- 13. 從對象分配到類實例
- 14. field.get和對象實例名稱
- 15. 對象實例的循環名稱
- 16. 如何獲取對象類定義的模塊名稱而不是對象實例化的模塊名稱?
- 17. 如何從不完整的類名獲取實例化對象?
- 18. python,如何從子實體中找到類對象?
- 19. 如何從AWS中的實例獲取實例名稱?
- 20. 如何從類實例的屬性中獲取屬性名稱?
- 21. 如何從Crystal中的字符串名稱創建類實例?
- 22. 如何從類別名稱中獲取類別對象
- 23. 從其對象中類的名稱
- 24. 從名稱檢查類型的實例
- 25. 從實例獲取類的名稱
- 26. 如何在ActionScript 3中從類的實例獲取類對象?
- 27. C#/ .NET如何從類名中找到包含名稱空間
- 28. 確定JavaScript對象實例的類的名稱
- 29. 的Java:創建時括號類名稱對象實例
- 30. Javascript對象繼承如何獲取子實例名稱