不幸的是,Qt不明確保留的接口:(
你能做的最好的是試圖通過投插件加載器返回的QObject * instance()
給定一個給定的接口列表或者使用一個類名或。使用其IID,使用qt_metacast
,即loader.instance()->qt_metacast("IFoo")
如果結果不爲零,則給定的類或者實現接口
,您可以將每個接口類信息,然後你可以列舉出來:
class Impl : public QObject {
Q_OBJECT
Q_INTERFACES(IFoo IBar)
Q_CLASSINFO("Interface", "IFoo")
Q_CLASSINFO("Interface", "IBar")
}
QStringList interfaces(QObject * obj) {
QStringList result;
auto count = obj->metaObject()->classInfoCount();
for (int i = 0; i < count; ++i) {
auto info = obj->metaObject()->classInfo(i);
if (strcmp(info.name(), "Interface") == 0)
result << QString::fromLatin1(info.value());
}
return result;
}
如果您希望依賴此功能,您需要修改moc
的副本以從Q_INTERFACES
自動生成相關的類別信息。 IIRC它只是一些值得改變的行,我在某個時候做過類似的事情。
Qt明確地爲接口創建元數據,但我似乎沒有找到任何方式來遍歷它。 – dtech
@ddriver元數據是以非常隱含的方式創建的:moc生成的代碼可以讓您將'QObject'轉換爲接口的實例,如果您知道接口的名稱。數據不會以任何其他方式保留:沒有任何接口列表:( –
嗯,它必須存儲名稱的實際字符串,因爲元系統使用字符串文字和運行時查找,它只是一個元數據系統設計中嚴重遺漏的是,這些數據不是以一種更有用的方式構建的,我也不喜歡它爲所有事情生成的事實,如果你能指定你想要的元數據類型會更好 – dtech