Qt中使用ActiveX控件

摘要:
lQAxContainer允许我们使用COM对象,并且可以将将ActiveX控件嵌入到Qt程序中去。lQAxServer可以将我们写的Qt控件导出为COM对象或者是ActiveX控件。第一个例子我们来演示一下在Qt中使用shockwaveFlash这个ActiveX控件。QAxWidget对象是用来封装ShockwaveFlash这个ActiveX控件。QAxContainer是有三个类组成的。这时就会调用CoCreateInstance创建ActiveX控件的实例。这时这个ActiveX控件的所有的属性、方法、事件将通过QAxWidget转换为Qt的properties、signals和slots。

(转自:http://blog.csdn.net/tingsking18/article/details/5403038)

在Qt中使用ActiveX控件

Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件。ActiveQt包含了两个组件QAxContainer和QAxServer。

lQAxContainer允许我们使用COM对象,并且可以将将ActiveX控件嵌入到Qt程序中去。

lQAxServer可以将我们写的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中的数据类型对应的表格:

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");

免责声明:文章转载自《Qt中使用ActiveX控件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python-字符串常用函数CentOS6 启动流程图文解剖下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[.NET] 使用 .NET Framework 開發 ActiveX Control

[.NET] 使用 .NET Framework 開發 ActiveX Control (1)–背景知識 ActiveX的歷史與技術基礎 只要是有八年以上程式開發經驗的開發人員,多多少少都會聽過ActiveX控制項(Control)這個東西,這個是只存活在Internet Explorer上的可程式化元件(Programmable Component),它...

CAD二次开发语言简介

CAD二次开发,有很多不同层次的语言和库可供选择。 首先是VisualLisp和AutoLisp。Lisp是一门历史悠久的函数式编程语言,很多概念和C这种过程式语言不一样,据说他在人工智能等方面有广泛的应用。 CAD引入了这种语言,给他添加相应的函数库,就成了命令行使用的AutoLisp。在此基础上再增加关于对话框和窗口界面的库,就是VisualLisp,...

如何发布ActiveX 控件

[背景] 做过ActiveX控件的朋友都知道,要想把自己做的ActiveX控件功能放在自己的网页上使用,那么用户在客户端就必须进行本地的注册,也就是说用户得首先要把该ActiveX控件(test.ocx)放在本机的%system%/system32下,然后运行DOS工具里面运行regsvr32 test.ocx命令进行注册。但如果真是这么去做的话,那么代表...

C# 制作ActiveX控件并添加到网页

1.创建ActiveX控件——按钮 2.定义一个接口,并在控件中实现 3.部署安装 4.CAB打包 5.添加到网页中进行测试 一. 创建ActiveX控件——按钮 1.新建一个Window窗体控件库项目,命名为ActiveXDemo.   2.在自动生成的UserControl1页面上添加一个button   3.点击事件里我们只弹出一个Me...

在线office文档编辑NTKO使用心得

目录 前言 什么是ntko 准备工作 实战演练 总结 一、前言 Web开发中经常需要用到在线处理office文档的功能,现在市面上有一些常用的Web页面调用显示Office的控件技术,用起来很方便。有一些第三方ActiveX浏览器控件:比如科瀚的SOAOffice中间件、卓正软件的pageoffice控件、WebOffice控件还有我这篇文章所要说到的...

写一个播放视频文件的ActiveX控件——MFC版(原创)

    介于自己的ATL学的不怎么样,而且现在掌握的也不是很熟练,所以还是先用MFC来写一个播放视频的ActiveX控件吧。用MFC做ActiveX控件非常简单,和用MFC做普通的Windows应用程序差不多是一样的步骤。所以,如果用过MFC的话,开发起来会非常的顺手。不过了,MFC是已经快过时了,不过在中国暂时还没有过时。还有一个问题,MFC做的界面非...