在Qt中使用ActiveX控件

原文地址:http://blog.csdn.net/tingsking18/article/details/5403038
原始作者“tingsking18”

Qt的windows商業版本提供了ActiveQt這個framework,使用這個組件我們可以在Qt中使用ActiveX控件,並且也開發基於Qt的ActiveX控件。ActiveQt包含了兩個組件QAxContainer和QAxServer。

l         QAxContainer允許我們使用COM對象,並且可以將將ActiveX控件嵌入到Qt程序中去。

l         QAxServer可以將我們寫的Qt控件導出爲COM對象或者是ActiveX控件。

第一個例子我們來演示一下在Qt中使用shockwaveFlash這個ActiveX控件。

#include <QApplication>
#include <QtGui>
#include <QAxWidget>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QAxWidget *flash = new QAxWidget(0,0);
    flash->resize(500,80);
    flash->setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}"));
    flash->dynamicCall("LoadMovie(long,string)",0,"c:/1.swf");
    flash->show();
   
    return a.exec();
}


QAxContainer不包含在QtCore裏面,所以要使用QAxContainer的話還必須要在.pro文件中添加 CONFIG+=qaxcontainer

下面就來解釋一下上面的代碼:

1.       首先我們創建了一個QAxWidget對象。QAxWidget對象是用來封裝ShockwaveFlash這個ActiveX控件。QAxContainer是有三個類組成的。分別是:QAxObject封裝了COM對象、QAxWidget封裝了ActiveX控件、QAxBase是QAxObject和QAxWidget的父類,它實現了封裝COM的核心函數。

這三個類的關係如下:

2.       然後通過setControl設置ShockwaveFlash這個ActiveX控件的class_id,class ID可以通過一些其它的編程工具獲得(vc/Delphi/Microsoft ActiveX Control Pad)。這時就會調用CoCreateInstance創建ActiveX控件的實例。這時這個ActiveX控件的所有的屬性、方法、事件將通過QAxWidget轉換爲Qt的properties、signals和slots。

通過調用QAxWidget的property()方法和SetProperty方法可以獲取和設置ActiveX控件的屬性。

既然可以調用ActiveX控件的方法屬性,當然也就需要有COM中的數據類型和Qt中的使用的數據類型的轉換了。下面就是COM中數據類型和Qt中的數據類型對應的表格:

Qt中數據類型與COM中的數據類型對照關係

 

3.       通過dynamicCall方法來調用ActiveX控件的方法。

1)dynamicCall()最多傳遞八個QVariant類型的參數,並且返回類型也是QVariant。

 

2)如果我們需要傳遞IDispatch *或者是IUnknown *,我們可以將這些組件封裝成QAxObject,然後通過調用asVariant()方法來將這個COM對象轉換爲QVariant。同樣如果我們返回一個IDispatch*或者IUnknown*的對象,就需要通過querySubObject方法將這個對象轉換爲QAxObject。

        QAxObject *session = outlook.querySubObject("Session");
 
3)如果不想這樣做還可以QAxWidget還爲我們提供了QueryInterface方法
IWebBrowser2 *webBrowser = 0;
 activeX->queryInterface(IID_IWebBrowser2, (void *)&webBrowser);
 if (webBrowser) {
     webBrowser->Navigate2(pvarURL);
     webBrowser->Release();
 }

4)dynamicCall方法還可以設置COM控件的屬性:
activeX->dynamicCall("Value", 5);
        QString text = activeX->dynamicCall("Text").toString();


5)通過dynamicCall調用COM對象的方法的時候需要提供完成的函數簽名。

activeX->dynamicCall("Navigate(const QString&)", "qt.nokia.com");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章