Qtプラグインプラグインの書き方と使い方を実践的に詳しく解説

目次

1. Qt プラグインとは何ですか? 利点は何ですか?

2. 実際のプロジェクト要件

3. プログラム設計の分析

4. Qtプラグインの作成

Q_DECLARE_INTERFACE(クラス名、識別子)

Q_インターフェース

5. プラグイン呼び出し

要約コメント:


1. Qt プラグインとは何ですか? 利点は何ですか?

いわゆるプラグインは、仮想関数がオーバーロードされた単なる dll であり、プラグインの原理である抽象ファクトリ クラスに似ています。qt プラグインは動的ライブラリと言えます。

        この関数では、インターフェイス インターフェイス ファイル、つまり、C/C++ キーワード extern と同様に、コードを生成するために静的ライブラリに依存する必要のないプラグイン インターフェイス ファイルをインポートします。最終的に、システム API を通じて dll などをロードします。この API は、Baidu で「動的ライブラリをロードする 2 つの方法」で見つけることができます。

        これを行うことの利点: 開発パラダイム、インターフェイス指向プログラミング、内部パッケージ化、モジュールと全体的なプロセス開発の分離を定義し、開発効率を向上させます。アプリケーション シナリオ QtCreator-IDE、WPS、visual Studio、Nodepad++ などはすべてこの開発方法を採用しています。

2. 実際のプロジェクト要件

        ディスプレイが組み込まれており、データを書き込むためにソフトウェアを作成する必要があります。表示画面の仕様については既にドキュメントが存在しており、そのドキュメントを読み、表示画面の仕様に従って、表示画面全体のデータインタフェースをページごとにパッケージ化し、個別に変更するためのインタフェースをパッケージ化する必要があります。ページ名/モデル/数量を指定し、プラグイン方式でパッケージ化します。カプセル化仕様ドキュメントの部分的なスクリーンショットは次のとおりです。

表示は以下の通りです

3. プログラム設計の分析

詳細は省きますが、特定の文字を表示プロトコルに合わせて16進数に変換し、シリアル通信でディスプレイに送信することで表示の制御を実現します。

実装したソフトは以下の通りです

 「書き込み」をクリックすると、指定したデータがディスプレイに書き込まれます。

         ソフトウェアのインターフェイスを作成しました。次に、インターフェイスをカプセル化するプラグインを作成し、それをソフトウェアに呼び出し、インターフェイスから返された値をシリアル通信を通じて表示画面に書き込む必要があります。

次にプラグインの書き方を説明します

4. Qtプラグインの作成

作成が完了すると、次のインターフェイスが表示されます。

 Qt テンプレートでは、QGenericPlugin クラスがデフォルトで継承されていますが、ここで使用する必要はなく、独自に抽象クラスを作成して継承し、サブクラス化して実装することにします。

新しいヘッダー ファイルを作成します。抽象クラスを実装する必要はないため、新しいヘッダー ファイルを作成するだけです。

         ここでは、新しいPackDataApiヘッダー ファイルを作成し、要件に従ってドキュメントのインターフェイスを追加しました (ソフトウェアによって呼び出される 4 つのインターフェイスがあります)。たとえば、表示画面のユーザー名とパスワードを変更したい場合、呼び出し後に変更するユーザー名とパスワードを入力するだけで、インターフェイスから特定の文字列が返され、変更できます。これらの文字列を表示画面のユーザー名とパスワードに送信する限り、表示画面に送信されます。 

クラスの外側の 2 行は何のためにあるのでしょうか?

#define PackDataApi_iid "PackDataPlugin.packdataapi"

Q_DECLARE_INTERFACE(PackDataApi, PackDataApi_iid)

Q_DECLARE_INTERFACE(クラス名、識別子)

このマクロは、識別子をクラス名インターフェイスに関連付けるために使用されます。この識別子は一意であり、このマクロは通常、クラスが定義された後に配置されます。

これは、識別子をクラス名インターフェイスに関連付けるプラグインを実装するために Qt が必要とするマクロです。PackDataApi_iid の識別子については、私は通常「プロジェクト名.インターフェースクラス名」を使用して識別しますが、これは個人の習慣に依存するため、繰り返さないでください。

抽象クラスインターフェイスを作成した後、次の図に示すように、実装するサブクラスに戻り、デフォルトの継承クラスを自分で実装した抽象クラスに変更し、以前の QObject を継承します。

 2つのマクロも使用されていることが判明

#if QT_VERSION >= 0x050000
    Q_PLUGIN_METADATA(IID PackDataApi_iid FILE "PackDataPlugin.json")
#endif // QT_VERSION >= 0x050000
    Q_INTERFACES(PackDataApi)

1 つ目: Q_PLUGIN_METADATA

このマクロは、インスタンス化されるプラグインの一部であるメタデータを宣言するために使用されます。
このマクロは、オブジェクトによってインスタンス化されるインターフェイスのIID を宣言し、メタデータ コンテンツを含むファイルを参照する必要があります。
Qt プラグインのソース コードでは、マクロには例外のみを含める必要があります。

このマクロは、インスタンス化できるクラス内でのみ使用できることに注意してください (抽象クラスでは使用できません)。
FILEはオプションのパラメータで、json ファイルを指します。
この json ファイルはビルド ディレクトリに (リソース ファイルとして) 含まれている必要があり、プラグイン テンプレートの作成時に自動的に生成され、その中に含まれています。そうしないと moc がエラーになります。

Q_インターフェース

このマクロは、クラスによってどのインターフェイスがインスタンス化されるかを Qt に伝えます。このマクロは通常、プラグインのインスタンスに使用されます

これらのマクロは、Qt の規定に従って作成する必要があります。

次に、以下に示すように、インターフェイスを実装し、インターフェイスの開発を支援するカスタム関数を追加します。

 主にプラグイン開発のプロセスを理解するために、具体的な実装は示しません。

実装後、コンパイルすると、生成されたディレクトリに動的ライブラリが生成されていることがわかります。これは、プログラムに対して動的にロードして呼び出すライブラリです。ロード後、インターフェイス クラスに変換されます。そしてそれを呼び出すことができます

5. プラグイン呼び出し

プラグインプログラムをコンパイルして動的ライブラリを生成しましたが、次はそれをどのように呼び出すのでしょうか?

呼び出し時に必要なのは、ダイナミック ライブラリとインターフェイスを実装するヘッダ ファイルだけです。私のソフトウェア プログラムを例として、生成されたダイナミック ライブラリをプログラム ディレクトリまたは指定されたディレクトリにコピーします。

インターフェースヘッダーファイルをプログラムのプロジェクトディレクトリに追加し、次のようにします。

 次に、インターフェイス ヘッダー ファイルをファイルに含めて、ダイナミック ライブラリをロードします。

 次にプラグインをロードします

 プラグインをロードするコードは次のとおりです。一般的に、プラグインがロードされるディレクトリに注意してください。

void GlobalHelper::loadPlugins()
{
    QDir pluginsDir(QCoreApplication::applicationDirPath());
    qDebug()<< (QString("正在加载BasePageApi插件,路径[%1]").arg(pluginsDir.path()));
    for(QString fileName: pluginsDir.entryList(QDir::Files)) {
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        QObject *plugin = pluginLoader.instance();
        if (plugin) {
            m_dataApi = qobject_cast<PackDataApi *>(plugin);
            if (m_dataApi) {
                qDebug()<<"BasePageApi插件加载成功!";
                return;
            }
        }
    }
    if(QMessageBox::critical(nullptr, "警告", "BasePageApi插件加载失败!", QMessageBox::Ok)==QMessageBox::Ok) {
        qDebug()<<("BasePageApi插件加载失败!!");
    }
}

これで通話が完了します

呼び出しプロセスを簡単に説明します。 1. インターフェイス ヘッダー ファイルの追加 2. ダイナミック ライブラリのロード 3. 呼び出し

他の人のためにそれを呼び出したい場合は、インターフェースのドキュメント、呼び出し方法、インターフェースの機能、パラメーターの意味などを記述するだけで済みます。

要約コメント:

        qt プラグインの開発は動的ライブラリの開発と言えます。呼び出し方法が似ているので慣れてください。また、Qt フレームワークを使用して開発するのは非常に簡単です。

        このような呼び出しプロセスを考えるとよく知られていますが、たとえば、会社がカメラを大量に購入し、そのカメラを二次開発して、必要な機能を実現し、それらを一連の機器に組み込み、その後、それらをユーザーに販売します。

        この時点で、メーカーは必ず開発ドキュメントを提供し、SDK パッケージ (ソフトウェア開発キット) を提供しますが、そのパッケージにはヘッダー ファイルと多数のライブラリ ファイルのみが含まれており、実装プロセスが複雑であるため、ソース ファイルは含まれていません。メーカー秘密なので一見の価値ありです。したがって、これらはすべて、静的ライブラリや動的ライブラリなど、呼び出すためのライブラリの形式でパッケージ化されています。自分が書いたものをどのように書いているかを他人に知られないようにするために、ライブラリのようなものが存在するのはこのためです。パッケージ化して秘密にしてください。これはあなた自身の知的財産です。

        Qt プラグインの開発や、独立したモジュールであるライブラリの開発もあります。一般に、大きなプロジェクトは多くのモジュールで構成されており、各モジュールは異なる担当者によって開発され、各モジュールには独自の役割があり、モジュールが開発された後、スタンドアップ コールに統合され、最適化されて最終的に完成します。プロジェクト。この利点は、開発効率が高く、それぞれがその役割を実行することでソフトウェア開発の独立性が高まり、プログラム モジュールが直接独立していることです。

        説明しすぎて、数時間かけて書きました。もう耐えられません。役に立ったと思ったら、高評価をして帰ってください⑧

おすすめ

転載: blog.csdn.net/qq_44667165/article/details/128833538