OCX控件的注册

首先,调用ocx控件需要保证ocx本身是已经注册了的。如果没有注册请先按“Win+R”输入"cmd"打开命令窗口。然后输入regsvr32 + ocx来进行注册。输入regsvr32 /u +ocx来进行卸载。

ocx注册实际上是将控件注册到了注册表里,可以在注册表里查询到控件的信息。

注册后,我们可以使用QT相关类通过控件的uuid来进行调用。

如果不知道控件的uuid是多少,可以使用oleview.exe来查询(需要管理员权限打开)

获取COM组件QT类型头文件

在使用时,需要知道控件的头文件,同时需要通过数据类型对照表将对应的类型转换到Qt的类型。那么如果只有控件,没有头文件该怎么办呢?

我们可以使用Qt安装目录下的dumpcpp.exe来生成头文件与cpp文件。

我的路径是:C:\Qt\Qt5.12.11\5.12.11\msvc2017\bin\dumpcpp.exe,可以自行进入对应安装目录查找。

在已经注册了ocx并且知道id的情况下,在该目录打开cmd,执行dumpcpp.exe {id}

生成了对应的头文件与源文件

头文件中的方法都由com的数据类型自动转换成了QT数据类型

QT的COM组件类

QT中提供了QAxBase、QAxWidget、QAxObject、QAxScript来实现对Active控件的使用

在使用时需要在pro文件中添加QT +=axcontainer

QAxBase是一个抽象类,不能实例化,他提供了API然后被QAxWidget和QAxObject继承。如果COM对象实现IDispatch接口,则该对象的属性和方法将作为Qt属性和插槽提供。他可以在COM组件的数据类型和QT对应的数据类型之间进行转换,有些COM的类型没有等价的Qt数据结构。数据类型对照表将放置在本文最后。下面是摘抄的官方示例:

dispinterface IControl
{
properties:[id(1)] BSTR text;[id(2)] IFontDisp *font;methods:[id(6)] void showColumn([in] int i);[id(3)] bool addColumn([in] BSTR t);[id(4)] int fillList([in, out] SAFEARRAY(VARIANT) *list);[id(5)] IDispatch *item([in] int i);
};QAxObject object("<CLSID>");QString text = object.property("text").toString();
object.setProperty("font", QFont("Times New Roman", 12));connect(this, SIGNAL(clicked(int)), &object, SLOT(showColumn(int)));
bool ok = object.dynamicCall("addColumn(const QString&)", "Column 1").toBool();QList<QVariant> varlist;
QList<QVariant> parameters;
parameters << QVariant(varlist);
int n = object.dynamicCall("fillList(QList<QVariant>&)", parameters).toInt();QAxObject *item = object.querySubItem("item(int)", 5);

通过示例可以看到,使用控件的CLSID示例化一个QAxObject对象就可以加载这个控件。

通过使用QObject::setProperty ()和QObject::property ())可以直接调用ocx的idl文件中的属性。不支持具有多个参数的属性

通过dynamicCall (“方法(参数类型)”,参数) ;的方式可以调用ocx的方法。

如果COM对象实现IDispatch接口,那么可以通过信号槽的方式来调用。

connect(buttonBack, SIGNAL(clicked()), webBrowser, SLOT(GoBack()));

对于有界面的OCX,使用QAxWidget来加载。

    callocx = new QAxWidget(parent);callocx->setControl(QString::fromUtf8("{21D328F3-B846-4a1e-9130-159163EC26D4}"));callocx->setProperty("Visible",true);callocx->show();callocx->dynamicCall("etBkColor(QColor)",QColor(255,255,142));

这样创建完运行时,会有一个单独的窗口显示ocx窗口。如果想要嵌入到自己的窗口里,可以在自己的窗口里创建一个布局,然后将QAxWidget添加入布局

ui->horizontalLayout->addWidget(callocx);

QT数据类型与COM数据类型对照表

COM type

Qt property

in-parameter

out-parameter

VARIANT_BOOL

bool

bool

bool&

BSTR

href="https://runebook.dev/zh-CN/docs/qt/qstring" QString

const QString

&

href="https://runebook.dev/zh-CN/docs/qt/qstring" QString

&

char,short,int,long

int

int

int&

uchar,ushort,uint,ulong。

uint

uint

uint&

float, double

double

double

double&

DATE

href="https://runebook.dev/zh-CN/docs/qt/qdatetime" QDateTime

const QDateTime

&

href="https://runebook.dev/zh-CN/docs/qt/qdatetime" QDateTime

&

CY

qlonglong

qlonglong

qlonglong&

OLE_COLOR

href="https://runebook.dev/zh-CN/docs/qt/qcolor" QColor

const QColor

&

href="https://runebook.dev/zh-CN/docs/qt/qcolor" QColor

&

SAFEARRAY(VARIANT)

href="https://runebook.dev/zh-CN/docs/qt/qlist" QList

<QVariant

>

const QList

<QVariant

>&

href="https://runebook.dev/zh-CN/docs/qt/qlist" QList

<QVariant

>&

SAFEARRAY(int),SAFEARRAY(double),SAFEARRAY(Date)

href="https://runebook.dev/zh-CN/docs/qt/qlist" QList

<QVariant

>

const QList

<QVariant

>&

href="https://runebook.dev/zh-CN/docs/qt/qlist" QList

<QVariant

>&

SAFEARRAY(BYTE)

href="https://runebook.dev/zh-CN/docs/qt/qbytearray" QByteArray

const QByteArray

&

href="https://runebook.dev/zh-CN/docs/qt/qbytearray" QByteArray

&

SAFEARRAY(BSTR)

href="https://runebook.dev/zh-CN/docs/qt/qstringlist" QStringList

const QStringList

&

href="https://runebook.dev/zh-CN/docs/qt/qstringlist" QStringList

&

VARIANT

type-dependent

const QVariant

&

href="https://runebook.dev/zh-CN/docs/qt/qvariant" QVariant

&

IFontDisp*

href="https://runebook.dev/zh-CN/docs/qt/qfont" QFont

const QFont

&

href="https://runebook.dev/zh-CN/docs/qt/qfont" QFont

&

IPictureDisp*

href="https://runebook.dev/zh-CN/docs/qt/qpixmap" QPixmap

const QPixmap

&

href="https://runebook.dev/zh-CN/docs/qt/qpixmap" QPixmap

&

IDispatch*

href="https://runebook.dev/zh-CN/docs/qt/qaxobject" QAxObject

*

QAxBase::asVariant()

href="https://runebook.dev/zh-CN/docs/qt/qaxobject" QAxObject

*(返回值)

IUnknown*

href="https://runebook.dev/zh-CN/docs/qt/qaxobject" QAxObject

*

QAxBase::asVariant()

href="https://runebook.dev/zh-CN/docs/qt/qaxobject" QAxObject

*(返回值)

SCODE, DECIMAL

unsupported

unsupported

unsupported

VARIANT*(自Qt 4.5起)

unsupported

QVariant&

QVariant&

【QT】Qt调用OCX控件详解相关推荐

  1. vs2015开发在网页中调用的ocx控件详解(二)

    在上一篇博客中介绍了ocx控件的基本创建,这里主要讲解如何在网页中与ocx控件进行信息传递. 1 ocx添加成员变量 在类视图中右键ocx_testLib下的_Docx_test,选择添加属性 变量类 ...

  2. Qt Quick - Popup控件详解

    Qt Quick - Popup控件详解 Popup是基于Qt Quick中的一种弹出式用户界面控件.它可以和Window或ApplicationWindow一起使用.如果想要确保一个Popup在场景 ...

  3. WindowsMediaPlayer 11 控件详解

    WindowsMediaPlayer 11 控件详解 转载别人的VB内容 C#中大多也通用 都是Microsoft的作品 . 属性/方法名: 说明: [基本属性] URL:String; 指定媒体位置 ...

  4. android什么控件能够输入多行文字,Android开发:文本控件详解——EditText(一)基本属性...

    一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint 输入框显示的提示文本 te ...

  5. Java调用ocx控件以及dll

    2019独角兽企业重金招聘Python工程师标准>>> http://lvqingboy-163-com.iteye.com/blog/769358 通过Java调用OCX控件有几种 ...

  6. Javascript调用OCX控件

    什么是ocx控件? 对象链接和嵌入用户控件(OCX)是一种可以由在微软的Windows系统中运行的应用软件创建使用的特殊用途的程序. 想知道究竟的可以看看这个帖子. http://www.tososo ...

  7. 【转】ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证)...

    [转]ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证) ASP.NET验证控件详解 现在ASP.NET,你不但可以轻松的实现对用户输入的验证,而且,还可以选择验证在服 ...

  8. 常用数据绑定控件详解

    常用数据绑定控件详解 GridView内容详解(1) GridView内容详解(2) DataList内容详解 ListView详解(一) ListView详解(二) 导航控件的高级应用 from:h ...

  9. C#中调用OCX控件

    调用OCX控件的步骤: 1.在系统中注册该ocx控件,命令:regsvr32.exe 控件位置(加 /u 参数是取消注册) 2.在.net的工具箱中添加该控件,拖到form中去就可以了. 不用工具箱的 ...

最新文章

  1. php ajax弹出框传值,PHP_Yii2.0 模态弹出框+ajax提交表单,如题 我们使用模态弹出框+ajax - phpStudy...
  2. python支持链式赋值和多重赋值_Python: 链式赋值的坑
  3. linux cp使用注意事项
  4. 分享 C++命名空间的解释
  5. Linux学习笔记(三)|Vim编辑器
  6. Struts2.3接收post方式提交的表单参数的方式
  7. 龙果充值平台,具备话费充值、流量充值、话费卡兑换功能;可以拓展其他充值兑换业务;也适用于支付、鉴权等业务功能的拓展。
  8. 计算机求是科学班2020年招生,浙江大学2020年三位一体综合评价招生分析:取消笔试,名额增加...
  9. python数据分类方法_Python数据挖掘—分类—贝叶斯分类
  10. 技术影响力和开发者生态如何打造?
  11. Java设计模式应用——工厂模式
  12. Spring boot设置文件上传大小限制
  13. 常用数字音频功放芯片-音频放大器
  14. 行业的英语术语大全之家居类术语
  15. matlab解微分方程例子,MATLAB解微分方程 [轉] | 學步園
  16. html怎么混合颜色,CSS3 多色混合背景
  17. Hive大总结!!!
  18. jQuery---仿芒果网机票预定智能输入提示
  19. linux的history命令只显示最新10条
  20. C语言高考志愿填报管理系统,高考志愿智能填报系统

热门文章

  1. 计算机网络邮件地址怎么写,电子邮件地址-计算机网络-西安交通大学.ppt
  2. 德勤 Intern - online assessment prep(二)
  3. PLC笔记(一)PLC入门姿势
  4. 2022年湖南省幼儿园职业园长证(高级)练习题及答案
  5. pyecharts 入门之地图(七)
  6. 【Verilog】Verilog的八个经典入门例题
  7. FMEA要求:PFMEA的基本要求
  8. ArcMap自定义图片符号
  9. cocos2dx3.x的EditBox和ControlSlider使用
  10. 【linux】curl安装