1. 程式人生 > >QT中使用ActiveX控制元件、QAxBase、QAxWidget

QT中使用ActiveX控制元件、QAxBase、QAxWidget

QaxContainer模組是訪問ActiveX控制元件和COM物件的一個Windows擴充套件。QAxContainer模組是ActiveQt構架的一部分。它提供一個庫,由擔當ActiveX控制元件容器角色的QWidget的子類Q...

QaxContainer模組是訪問ActiveX控制元件和COM物件的一個Windows擴充套件。

    QAxContainer模組是ActiveQt構架的一部分。它提供一個庫,由擔當ActiveX控制元件容器角色的QWidget的子類QAxWidget 和 用來簡化訪問非視覺化COM物件的QObject的子類QAxWidget 實現。通過類QAxScript, QAxScriptManager和QAxScriptEngine可以解釋嵌入的COM物件,還有一個工具集使得程式設計訪問COM物件更容易。

    模組由6個類構成:
        1. QAxBase 是一個提供用來初始化和訪問一個COM物件及ActiveX控制元件的API的抽象類。
        2. QAxObject是一個包裝了COM物件的QObject。
        3. QAxWidget 是一個包裝了ActiveX控制元件的QWidget。
        4. QAxScriptManager, QAxScript 和 QAxScriptEngine provide an interface to the Windows Script Host.

Some example applications that use standard ActiveX controls to provide high-level user interface functionality are provided.
提供了一些使用標準ActiveX控制元件來提供高階使用者介面功能的示例。
The QAxContainer module is part of the Qt Desktop Edition for Windows. It is not part of the Qt Open Source Edition.
=====================================================

1. 使用庫

    構造使用COM物件和ActiveX控制元件的Qt應用程式,需要向.pro檔案中加入
            CONFIG += qaxcontainer
來連線到QAxContainer模組

1.1. 配置QAxContainer應用程式

    QaxContainer庫是靜態的,因此使用這個模組的時候不需要重新分配任何額外的檔案。但要注意,你所使用的提供ActiveX服務的二進位制檔案必須被安裝在目標系統中,因此你需要把它們裝在你的釋出包中並在你的應用程式安裝過程中為它們註冊。


2. 初始化COM物件

     可以通過使用QAxBase::setControl() 或 直接把物件的名字傳到QAxBase子類的構造器中 來初始化一個COM物件。

     控制元件能通過多種格式指定,但最快且功能最強的格式是直接使用物件的Class ID(CLSID)。 Class ID能考慮到這個物件涉及別的機器時資訊的變化,而且能為需要license的控制元件包括一個license key。

2.1. 典型的錯誤資訊

    ActiveQt在執行中遇到錯誤時會向debug output顯示錯誤資訊。通常要在偵錯程式下執行你的程式來檢視這些資訊(e.g. in Visual Studio's Debug output)。

    -- Requested control could not be instantiated
                The control requested in QAxBase::setControl() is not installed on this system, or is not accessible for the current user.     The control might require administrator rights, or a license key. If the control is licensed, pass the license key to QAxBase::setControl as documented.


3. 訪問物件API

模組提供了訪問COM物件的Qt API來取代COM的資料型別。

有4種方法去呼叫訪問COM物件的API:
         • Generating a C++ namespace
         • Call-by-name
         • Through a script engine
         • Using the native COM interfaces

3.1. 生成 C++ Namespace

    用dumpcpp 工具可以為想要訪問的型別庫生成一個C++名空間。需要手動對你要用的型別庫使用這個工具, 或者也可以通過向.pro檔案中的變數TYPELIBS新增型別庫來把它整合到編譯系統中:
            TYPELIBS = file.tlb
注意,dumpcpp不一定能列出型別庫中所有的API。
把生成的標頭檔案包含進你的程式碼中,通過生成的C++類來訪問物件API。 更多資訊可以參考示例Qutlook。

3.2. Call-by-Name

    用QAxBase::dynamicCall()、QAxBase::querySubObject() 和QObject::setProperty()、QObject::property() 能通過名字呼叫COM物件的方法和屬性。用dumpdoc工具能獲得COM物件和他的字物件的Qt API文件。注意不是所有的COM物件的API是可用的。
更多請參看示例Webbrowser。

3.3. Calling Function Through a Script Engine

    Qt應用程式能使用安裝在系統上的任何ActiveScript engine。Script engine能執行指令碼程式碼去訪問COM物件。

    使用script engine時,用QAxScriptManager::addObject()註冊你想通過指令碼訪問的COM物件,用QAxScriptManager::load()把script程式碼裝入引擎。接著就可以用QAxScriptManager::call() 或 QAxScript::call()來呼叫script函式。

    COM物件的API結束了指令碼對所使用的指令碼語言的依賴。
    ActiveX Test Container 示範瞭如何裝載指令碼檔案。

3.4. Calling a Function Using the Native COM Interfaces

    上面的方法都不能訪問的COM物件函式,可以直接用QAxBase::queryInterface()去查詢COM介面。它可以獲得控制元件的型別庫中用#import標示的各個介面類的C++定義;更多的細節請看你的編譯器手冊。

3.5. 典型的錯誤資訊

    ActiveQt在執行中遇到錯誤的時候會向debug output顯示錯誤資訊。通常你必須在偵錯程式下執行你的程式來檢視這些資訊(e.g. in Visual Studio's Debug output)。

    -- QAxBase::internalInvoke: No such method
            A QAxBase::dynamicCall() failed - the function prototype did not match any function available in the object's API.

    -- Error calling IDispatch member: Non-optional parameter missing
            A QAxBase::dynamicCall() failed - the function prototype was correct, but too few parameters were provided.

    -- Error calling IDispatch member: Type mismatch in parameter n
            A QAxBase::dynamicCall() failed - the function prototype was correct, but the paramter at index n was of the wrong type and could not be coerced to the correct type.

    -- QAxScriptManager::call(): No script provides this function
            You try to call a function that is provided through an engine that doesn't provide introspection (ie. ActivePython or ActivePerl). You need to call the function directly on the respective QAxScript object. 

相關推薦

QtActiveX控制元件跑官方例程記錄

目錄(?)[-] 開發環境 基礎知識瞭解 QT的ActiveX控制元件形式 in-process執行的ActiveX server控制元件 獨立執行的ActiveX server控制元件 開發環境 win7 64+QT

如何設定Qt控制元件透明度

引入QGraphicsOpacityEffect類,設定QGraphicsOpacityEffect物件的透明度,然後將此透明度應用到控制元件上。 需要包含的標頭檔案: #include <QGraphicsOpacityEffect> 程式碼: ... m_w

Qt窗體控制元件按照比例縮放,自適應視窗大小進行佈局

    最近在做本科畢設,用到了Qt,無奈本人實在是太過於小白了,很多東西都進行了很久的探索,比如今天說到的窗體控制元件佈局...一把辛酸淚     首先就是建立一個GUI檔案,然後進行UI設計,這裡就只需要從左邊進行拖拽,這個很easy啦...     然後對其進行佈局

MFCActiveX控制元件的使用

    Windows系的開發做的很少,也暈乎暈乎的。     最近學習了下Arcgis的開發,話說C++開發相關的資料還真少。好不容易從網上找了篇資料,算是入了門(或者還在門外頭,但是找到門了)。感謝這位同仁:     http://blog.csdn.net/yiers

QT使用ActiveX控制元件QAxBaseQAxWidget

QaxContainer模組是訪問ActiveX控制元件和COM物件的一個Windows擴充套件。QAxContainer模組是ActiveQt構架的一部分。它提供一個庫,由擔當ActiveX控制元件容器角色的QWidget的子類Q... QaxContainer模組是

寫了一段VBA程式碼後, Excel每次儲存時都彈出警告:”此文件包含巨集Activex控制元件XML擴充套件包資訊“(office 2007)

前言:今天在寫一段VBA程式碼之後,遇到一個問題,             Excel每次儲存時就報一個警告(使用的是office 2007):                          此文件中包含巨集、Activex控制元件、XML擴充套件包資訊        

VS程式設計,WPF,後臺C#程式碼設定Grid控制元件某一行某一列高度或者寬度的一種方法

有時為了顯示的需要,想在某個操作後將Grid中的一列的寬度變成0或者根據內容自動調整。 這裡提供了一個方法,可在後臺程式碼中對Grid的行或者列進行調節。  1、XAML前臺中,給Grid的列起

QT學習day04---Input Widgets控制元件(Text Edit(Double)Spin BoxDate/time EditDial)

此篇學習以下控制元件:  一、Text Edit 文字框:一個文字框,可以輸入內容 //常用函式 toPlainText();//得到文字內資料,返回值為QString ui介面雙擊可以進行

Android開發:如何在選單呼叫控制元件(如ButtonTextView……)

當我們在類內定義控制元件的全域性變數時,如Button……,只能在onCreate()中初始化,這樣的控制元件變數引用在選單中不好引用,會報錯。 如果想在選單中呼叫控制元件,可以在選單中重新定義控制元件

關於“此工作薄已丟失了其VBA專案ActiveX控制元件及其他任何與可程式設計序相關的功能”的提示的解決

 在使用Office2003時,找不到HEX2DEC函式,上網搜尋得知其為工程函式,需要在“工具”->“載入巨集”中選定“分析工具庫”,但是依照指導做了以後,開啟EXCEL文件提示“此工作薄已丟失了其VBA專案、ActiveX控制元件及其他任何與可程式設計序相關的功能”

關於ActiveX控制元件開發js呼叫

控制元件製作: 32位控制元件製作 64位控制元件製作 參考:一、建立;二、介面;三、js呼叫 說明:64位控制元件的js呼叫我按上述教程製作,呼叫可以,但是控制元件中沒有文章中說的控制元件中顯示的

bootstrap-wysiwygJS控制元件富文字的圖片由本地上傳到伺服器(阿里雲七牛自己的資料庫)

一、我假設你是要儲存到自己的資料庫中(因為上傳到阿里雲、七牛更簡單原理一樣的) 點選插入圖片如下圖: 1、其實你插入的時候不需要做什麼處理一樣也可以插入資料庫的(但是前提你插入的那個欄位必須要求足夠空間比如Mysql你要用LONGTEXT型別,否則是存不下的這樣子前臺獲

C#combobox 控制元件屬性事件方法

一 、combobox 屬性、事件、方法公共屬性 名稱 說明 AccessibilityObject 獲取分配給該控制元件的 AccessibleObject。AccessibleDefaultActionDescription 獲取或設定控制元件的預設操作說明,供輔助功能客戶端應用程式使用。Acces

Qt自定義控制元件的建立與初步使用(二)之圖片上繪製文字箭頭曲線

本文目的:編輯自定義控制元件的介面ui,並在圖片上添文字、箭頭、曲線、開啟、儲存等功能。並說明了如何去使用這個編輯好的ui介面控制元件! 上次簡單的說明了如何去建立Qt自定義控制元件,當時還是對其瞭解不夠深刻,現在看來,QT自定義控制元件就是你事先把介面寫好(一般基於QWi

C#容器控制元件GroupBoxPanelTabControl的應用

實現如圖所示登入介面,當輸入正確使用者名稱及密碼時,轉到主介面,否則給出錯誤提示。要求不同身份的登陸者擁有不同的操作許可權。          原始碼:1.初始化三個string型別的變數分別用來儲存使用者名稱、密碼和身份。string yhm, mm, sf;priva

C#容器控制元件GroupBoxPanelTabControl

實現如圖所示登入介面,當輸入正確使用者名稱及密碼時,轉到主介面,否則給出錯誤提示。要求不同身份的登陸者擁有不同的操作許可權。          原始碼:1.初始化三個string型別的變數分別用來儲存使用者名稱、密碼和身份。[csharp] view plain copy print?string yhm

Qt實現表格控制元件-支援多級列表頭多級行表頭單元格合併字型設定等

目錄 一、概述 二、效果展示 三、定製表頭 1、重寫資料來源 2、重寫QHeaderView 四、設定屬性 五、相關文章

C# 公共控制元件之progressBar toolTip

1、窗體中加入控制元件progressBar1,  toolTip1,timer1 和三個button 2、程式碼如下: private void button1_Click(object sender, EventArgs e)//開始 { timer1.

iOS之用xib給控制元件設定圓角邊框效果

轉自:https://www.cnblogs.com/zhun/p/5616540.html   xib中為各種控制元件設定圓角 通過程式碼的方式設定 @interface ViewController () @property (weak, nonatomic)

Qt QTreeWidget 加入控制元件——以QPushButton為例

QPushButton *topLevelButton = new QPushButton("Top Level Button"); ui->treeWidget->addTopLevelItem(topLevelItem); ui->tre