QPluginLoaderでプラグインを複数生成する方法

QTにはあらかじめプラグインを作るための装置としてQPLuginLoaderが用意されています。

ここでは動的なプラグインができている前提で話を進めるのでプラグインの作り方については「共有ライブラリを使ったプラグインの作り方」にまとめたのでそこを見てください。

では、QPluginLoaderを使って次のようにMyPluginというプラグインをインスタンス化したとします。

QPluginLoader pluginLoader("MyPlugin");
QObject * plugin = pluginLoader.instance();
MyPlugin * myPlugin = qobject_cast<MyPlugin*>(plugin);

ここまではいいのですが、instance関数でインスタンス化できるオブジェクトは1つのアプリケーションで1つだけです。複数回呼び出すことはできません。

では、どうすればいいかというと初めにプラグインののコンストラクタにQ_INVOKERマクロを付加します。

class MyPlugin
{
    Q_INVOKER MyPlugin();
};

Q_INVOKERマクロをつけることでメタオブジェクト機能が使えるようになります。

メタオブジェクトとは実行時にQObjectを柔軟に扱うための機能でその機能の1つに新しいオブジェクトの生成機能があります。

この機能を利用すれば次のようにプラグインを複数生成できます。

QPluginLoader pluginLoader("MyPlugin");
QObject * basePlugin = pluginLoader.instance();

/**複数のプラグインを作る。*/
MyPlugin * myPlugin1 = basePlugin.metaObject().newInstance();
MyPlugin * myPlugin2 = basePlugin.metaObject().newInstance();
//以下略...

この例のようにQMetaObjectnewInstance関数が対象オブジェクトのコンストラクタを呼び出せばいくらでもプラグインを量産可能になります。

以上がプラグインを複数生成する方法です。では、また。

関連項目
プライバシーポリシー