Qt開發Activex筆記(二):Qt呼叫Qt開發的Activex控制元件

紅胖子(紅模仿)發表於2021-02-14

若該文為原創文章,轉載請註明原文出處
本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/113789693

長期持續帶來更多專案與技術分享,諮詢請加QQ:21497936、微信:yangsir198808

 

前言

  開發Activex控制元件,以供其他應用程式呼叫,本篇章講解Qt呼叫Activex控制元件,不限於Qt開發的Activex控制元件。

 

Demo

  在這裡插入圖片描述

 

QAxWidget

概述

  QAxWidget類是包裝ActiveX控制元件的QWidget。
  QAxWidget可以例項化為空物件,帶有它應該包裝的ActiveX控制元件的名稱,或者帶有指向ActiveX控制元件的現有介面指標。ActiveX控制元件的屬性、方法和事件僅使用QAxBase支援的資料型別,可以作為Qt屬性、插槽和訊號使用。基類QAxBase提供了一個API,可以通過IUnknown指標直接訪問ActiveX。
  QAxWidget是一個QWidget,通常可以這樣使用,例如,它可以組織在一個widget層次結構和佈局中,或者充當一個事件過濾器。支援標準小部件屬性,例如enabled,但它依賴於ActiveX控制元件來實現對環境屬性(例如palete或font)的支援。QAxWidget試圖提供必要的提示。
  但是,不能重新實現特定於Qt的事件處理程式,如mousePressEvent或keyPressEvent,並期望可靠地呼叫它們。嵌入式控制元件完全覆蓋QAxWidget,通常處理使用者介面本身。使用特定於控制元件的API(即偵聽控制元件的訊號),或使用標準COM技術,如window過程子類化。
  QAxWidget還從QAxBase繼承了大部分與ActiveX相關的功能,特別是dynamicCall()和querySubObject()。
  警告:可以將QAxWidget子類化,但不能在子類中使用Q_OBJECT巨集(生成的moc檔案將不會編譯),因此無法新增更多訊號、插槽或屬性。這種限制是由於執行時生成的元物件資訊造成的。要解決此問題,請將QAxWidget聚合為QObject子類的成員。

 

Qt呼叫Activex方法

步驟一:註冊activex控制元件

  執行之前先要註冊,使用Qt下自帶的idc註冊一下。

idc -regserver activeHelloWorldDemo.dll

  在這裡插入圖片描述

步驟二:確認activeQt控制元件的clsid

  檢視一下,開啟登錄檔並搜尋一下,確認clsid,如下圖:
  在這裡插入圖片描述

"2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC"

步驟三:使用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();
}
 

相關文章