プラグイン(拡張機能)
拡張機能は、メインアプリケーションの実行中にロードされるように設計された共有動的ライブラリであり、少なくとも1つの特別なインターフェイスを実装する必要があります。
拡張機能は2つのタイプに分けられます。
独自の拡張システムとその拡張機能自体を作成する方法を理解しましょう。
拡張機能との通信は、インターフェイス(信号、スロット、クラスメソッド)を使用して実行されます。 拡張機能は、 QPluginLoaderクラスを使用してアプリケーションによってロードされます。 拡張機能をロードするには、 instance()メソッドを使用します。このメソッドは、拡張機能オブジェクトを作成し、それへのポインターを返します。 unload()メソッドは 、拡張機能をアンロードするために使用されます。
パート1
最初の例では、拡張機能から関数(アルゴリズム、式)を使用する拡張機能を作成します。
プロジェクトの視覚的なスキームは次のようになります。
ステージ1:
最初のステップは、QObject型から継承されたインターフェイスクラスを作成することです。インターフェイスとして、QString型の変数を受け入れ、大文字で同じ文字列を返すメソッドがあります。 Q_DECLARE_INTERFACEマクロを使用して、インターフェイスの識別子を設定し、コンパイラcは識別子文字列のメタ情報を生成します。 このモジュールは、プラグインとメインプログラム間の通信プロトコルであり、プラグインプロジェクトとメインプロジェクトで使用されます。
クラスは次のようになります。
ステージ2:
拡張機能をダウンロードする基本的なアプリケーションを作成しましょう。 ボタンを押すと、拡張機能が検索され、システムにロードされます。 さらにインターフェースを通じて、関数を使用します。
基本アプリケーション:
mainproject.h
mainproject.cpp
ステージ3:
拡張機能を作成するには、最初に行うことはプロファイルでビルドされるプロジェクトのタイプを変更することです。このため、次の行TEMPLATE = libを追加し、CONFIG + =プラグイン拡張機能のプロジェクト構成を設定する必要があります。
upperstringplugin.pro
#------------------------------------------------- # # Project created by QtCreator 2019-04-03T11:35:18 # #------------------------------------------------- QT += core greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = upperStringPlugin TEMPLATE = lib CONFIG += plugin DESTDIR = ../Plugins DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ upperstringplugin.cpp HEADERS += \ upperstringplugin.h \ interface.h
次に、将来の拡張用のクラスを作成します。クラスはインターフェイスのクラスから継承する必要があります。 マクロQ_INTERFACESには、拡張機能に必要なすべてのメタ情報を生成するためのコンパイラが必要です。 Q_PLUGIN_METADATA()マクロは、Qtライブラリの拡張機能とアクセスへのエントリポイントを設定します。 また、メタ情報を含むinteface.jsonファイルを作成する必要があります(ファイルはプロジェクトのルートにある必要があります)。この場合、情報はないため、空の引用符{}をファイルに記述します。
upperstringplugin.h
upperstringplugin.cpp
プロジェクトのコンパイルの出力で、拡張子が.soのファイルを取得し、このファイルをメインプロジェクトのPluginsフォルダーに移動して開始します。 この場合、拡張機能はメインプログラムにロードされ、単一の拡張機能オブジェクトが作成されます。 インスタンス()関数を再利用しようとすると、関数は既に作成されている拡張オブジェクトへのポインターを返します。
プログラム実行
パート2
タスクを複雑にするために、今度は拡張機能がウィジェットであり、そのようなウィジェットをいくつか作成できる必要があります。 メインプログラムはプラグインからメッセージを受信し、応答を送り返します。 新しいプロジェクトを作成しましょう。最初の段階では、2つのクラスのインターフェイスが必要です。1つは拡張機能のロードとウィジェットの作成を担当し、もう1つはウィジェット自体の操作を担当します。
プロジェクトのスキームは次のようになります。
ステージ1:
最初のインターフェイスクラスには、プラグイン名を取得するプラグインウィジェットを取得する2つの関数があります。 プラグインの名前は、システムで識別できるように保存されます。 メインアプリケーションのMDIウィンドウにプラグインウィジェットを追加します。
2番目のクラスはグラフィカルウィジェット自体であり、QWidgetから継承されます。ここで必要な機能を指定しました。ウィジェットはメッセージを受信し、メインプログラムに送信します。
interface.h
ステージ2:
メインプログラムは、プラグインからメッセージを受信するためのメインウィジェットと、プラグインが呼び出されたときに動的に表示される追加ウィンドウがあるMDIウィンドウで構成されます。
プラグインウィジェットを作成するとき、プラグインからの信号をスロットに接続し、sender()関数を使用して、メッセージを送信したプラグインへのポインターを取得します。 作成したウィジェットをMDIウィンドウに配置すると、プラグインオブジェクト自体をシステムからアンロードできます。
mainproject.h
mainproject.cpp
メインウィンドウはメッセージを受け入れて表示します。
mainwidget.h
mainwidget.cpp
ステージ2:
プラグインを作成します。そのアイデアは、ウィジェットを作成するためのファクトリーであるということです。
plugin.h
plugin.cpp
プラグインによって作成されたウィジェット。
texttranferwidget.h
texttranferwidget.cpp
メインプログラムの出力: