記事が元の記事である場合は、転載の元のソースを示してください。
この記事のブログアドレス:https://blog.csdn.net/qq21497936/article/details/113789693
今後もプロジェクトやテクノロジーの共有をさらに増やしていきます。お問い合わせはQQ:21497936、WeChat:yangsir198808を追加してください。
Qt開発コラム:開発技術
前:「Qt開発ActiveXノート(1):環境設定、基本的な開発プロセス、デモデモ」
次:「Qt開発ActiveXノート(3):C#はQtによって開発されたActiveXコントロールを呼び出す」
序文
他のアプリケーションが呼び出すActiveXコントロールを開発するこの章では、Qtが開発したActiveXコントロールに限らず、QtがActiveXコントロールを呼び出す方法について説明します。
デモ
QAxWidget
概要概要
QAxWidgetクラスは、ActiveXコントロールをラップするQWidgetです。
QAxWidgetは、ラップするActiveXコントロールの名前、またはActiveXコントロールへの既存のインターフェイスポインタを使用して、空のオブジェクトとしてインスタンス化できます。ActiveXコントロールのプロパティ、メソッド、およびイベントは、QAxBaseでサポートされているデータ型のみを使用し、Qtプロパティ、スロット、およびシグナルとして使用できます。基本クラスQAxBaseは、IUnknownポインターを介してActiveXに直接アクセスできるAPIを提供します。
QAxWidgetはQWidgetであり、通常はこのように使用できます。たとえば、ウィジェットの階層とレイアウトに編成したり、イベントフィルターとして機能したりできます。有効などの標準ウィジェット属性をサポートしますが、環境属性(パレットやフォントなど)をサポートするためにActiveXコントロールに依存します。QAxWidgetは、必要なヒントを提供しようとします。
ただし、mousePressEventやkeyPressEventなどのQt固有のイベントハンドラーを再実装して、それらを確実に呼び出すことは期待できません。埋め込みコントロールはQAxWidgetを完全にカバーし、通常はユーザーインターフェイス自体を処理します。コントロール固有のAPIを使用する(つまり、コントロールシグナルをリッスンする)か、ウィンドウプロシージャのサブクラス化などの標準のCOM手法を使用します。
QAxWidgetは、ActiveXに関連するほとんどの関数(特にdynamicCall()とquerySubObject())もQAxBaseから継承します。
警告:QAxWidgetはサブクラス化できますが、Q_OBJECTマクロをサブクラスで使用することはできません(生成されたmocファイルはコンパイルされません)。そのため、シグナル、スロット、または属性を追加できません。この制限は、実行時に生成されるメタオブジェクト情報が原因で発生します。この問題を解決するには、QAxWidgetをQObjectサブクラスのメンバーとして集約します。
QtはActiveXメソッドを呼び出します
ステップ1:ActiveXコントロールを登録する
実行する前に登録し、Qtに付属のidcを使用して登録します。
idc -regserver activeHelloWorldDemo.dll
ステップ2:activeQtコントロールのclsidを確認します
以下に示すように、それを確認し、レジストリを開き、clsidを確認するために検索します。
"2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC"
ステップ3:QAxWidgetを使用して
QAxWidget *pAxWidget = new QAxWidget();
pAxWidget->resize(400, 320);
pAxWidget->setControl("2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC");
pAxWidget->show();
ソースコード
#include <QApplication>
#include <QAxWidget>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QAxWidget *pAxWidget = new QAxWidget();
pAxWidget->resize(400, 320);
pAxWidget->setControl("2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC");
pAxWidget->show();
return a.exec();
}
前:「Qt開発ActiveXノート(1):環境設定、基本的な開発プロセス、デモデモ」
次:「Qt開発ActiveXノート(3):C#はQtによって開発されたActiveXコントロールを呼び出す」