2016-01-28 27 views
0

我可以從我的Qt插件訪問大量元數據,但無法像QMetaEnums那樣訪問枚舉。然而,我可以在我的類中獲得返回該枚舉的方法,並且可以將其轉換爲QMetaType並獲取其ID(1026)。我也需要QMetaEnum中包含的信息。我想我錯過了一些東西。請看看我的代碼:Qt插件:無法從Qt插件獲取枚舉的元數據

//Plugin interface 
class PluginInterface 
{ 
public: 
    virtual void initialize() = 0; 
}; 
#define PluginInterface_iid "pluginInterface" 
Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid) 


//Actual plugin implementing PluginInterface 
enum Fruit{ Apple, Pear, Mango }; 
Q_DECLARE_METATYPE(Fruit) 
class MYQTCALCPLUGINSHARED_EXPORT MyQtCalcPlugin : public QObject, PluginInterface 
{ 
    Q_CLASSINFO("version", "0.1") 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID PluginInterface_iid FILE "myqtcalcplug.json") 
    Q_INTERFACES(PluginInterface) 
    Q_ENUMS(Fruit) 
public: 
    explicit MyQtCalcPlugin(QObject *parent = 0); 
void MyQtCalcPlugin::initialize() 
{ 
    qRegisterMetaType<MyQtCalcPlugin*>("MyQtCalcPluginPtr"); 
    qRegisterMetaType<Fruit>("Fruit"); 
    qRegisterMetaType<Fruit*>("FruitPtr"); 
} 
public slots: 
    Fruit TasteFruit() 
    { 
     return Fruit::Apple; 
    } 
}; 
#endif // MYQTCALCPLUGIN_H 

//application that is reading the metadata 
QPluginLoader pluginLoader(pluginPath); 
if (pluginLoader.load()); 
QObject *pluginInstance = pluginLoader.instance(); 
auto pluginInterface = qobject_cast<PluginInterface*>(pluginInstance); 
pluginInterface->initialize(); 
const QMetaObject *pMetaObject = pluginInstance->metaObject(); 
int count = pMetaObject->enumeratorCount(); //count becomes 0 
+1

也許你需要在插件類中聲明枚舉? – Evgeny

+0

@Evgeny,它的工作!謝謝! – armanali

回答

0

Enum已經從課堂外移到裏面了。這解決了這個問題。 Q_DECLARE_META_TYPE(水果)和qRegisterMetaType是多餘的:

#define PluginInterface_iid "pluginInterface" 
Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid) 

//Actual plugin implementing PluginInterface 
class MYQTCALCPLUGINSHARED_EXPORT MyQtCalcPlugin : public QObject, PluginInterface 
{ 
    Q_CLASSINFO("version", "0.1") 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID PluginInterface_iid FILE "myqtcalcplug.json") 
    Q_INTERFACES(PluginInterface) 
    Q_ENUMS(Fruit) 
public: 
    enum Fruit 
    { 
     Apple, 
     Pear, 
     Mango 
    }; 
}