2016-04-25 4 views
2

カスタムプラグイン(QPluginLoaderがロードされています)を許可するQtアプリケーションがあります。これらのプラグインはいくつかのインターフェイスを実装でき、Q_INTERFACES()マクロで宣言します。あなたは下のリンクQtのドキュメントを見ればQtプラグイン:プラグインで実装されているすべてのインターフェイスを一覧表示する方法はありますか?

、私は「低レベル」のAPIについて話している: http://doc.qt.io/qt-5/plugins-howto.html

さて、これは私の質問です:私はQPluginLoaderでプラグインをロードした後、ありますそれが実装するすべてのインターフェイスを列挙する方法がありますか?基本的には、プラグインがプラグインをロードするメインアプリケーションからQ_INTERFACES()マクロに宣言したものを列挙する方法はありますか?

現在のところ、アプリケーションはQt4とQt5の両方で動作しますが、Qt5だけで動作するソリューションも受け入れられます。

+0

Qtは、インターフェイスのメタデータを確実に作成しますが、それを繰り返し処理する方法は見つけられません。 – dtech

+0

@ddriverメタデータは非常に暗黙的に作成されます。mocは、インターフェイス名を知っている場合は、インターフェイスのインスタンスに 'QObject'をキャストできるコードを生成します。データは他の方法では保持されません。( –

+0

)メタシステムは文字列リテラルで動作し、実行時ルックアップを行うので、名前の実際の文字列を格納する必要があります。メタデータの設計における重大な省略は、このデータがより有用な方法で構造化されていないことを意味します。私はそれがすべてのために生成されているのは気に入らず、あなたが望むメタデータの種類 – dtech

答えて

1

残念ながら、Qtは明示的インターフェイスのリストを保持しません:(

あなたができる最善のクラス名を使用するかのどちらか与えられている特定のインターフェイスにプラグインローダーによって返さQObject * instance()をキャストしようとすることです。。すなわちloader.instance()->qt_metacast("IFoo")qt_metacastを使用して、そのIIDを使用して結果がゼロでない場合は、指定されたクラスがインタフェースを実装し

を別の方法として、あなたは、クラス情報として、各インターフェイスを追加することができ、あなたはそれらを列挙することができます。

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; 
} 

この機能に依存したい場合は、のコピーを修正して、関連するclassinfoを自動的にQ_INTERFACESから生成したい場合があります。 IIRCそれはちょうど変化の価値がある数行です、私はある点でそれのような何かをしました。

+0

プラグインを実装する人は、 'InterfaceInfo'インターフェースに' virtual QStringList interfaces() 'を入れ、それを各プラグインに組み込み、手作業で実装することができます。 – dtech

+0

@ddriver真::) –

+0

答えをありがとう! Qtがインタフェースを列挙する方法を提供していないのはあまりにも悪いことです。コンテキストでは、私の目標は、使用可能なすべてのインターフェイスからそれらを実装するすべてのプラグインへのマップを作成することでした。したがって、指定されたインターフェイスとやりとりしたい人は、利用可能なすべてのプラグインを照会できます。この方法で、私は(他のものの中でも)プラグインの依存システムを実装することができました。 – Daniele

関連する問題