【QT】Qt调用OCX控件详解

OCX控件的注册

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

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

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

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

9d89f228097a98879fb93c9b7e79a4fd.png

获取COM组件QT类型头文件

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

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

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

811d137808792d72fd23595b6d13190f.png

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

dbe2e42c2c48cf922a6425bd3b95cdb1.png

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

762083b9e36105ce2a7b278998bf2bd2.png

头文件中的方法都由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);

e28630f11065b5388ced1aa3037e5a99.png

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&

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 谷歌浏览器(Google Chrome)是一款目前应用广泛的网页浏览器,用于访问互联网上的各种网页内容。与其他浏览器相比,谷歌浏览器具有更快的网页加载速度、强大的安全性和用户体验。 在使用谷歌浏览器浏览网页时,有时候我们会遇到需要调用OCX(Object Control Extension,对象控件扩展)控件的情况。OCX是一种在Windows操作系统上运行的二进制对象控件,与ActiveX控件类似,用于增强浏览器的功能。 当谷歌浏览器需要调用OCX控件时,它会按照预设的规则查找并加载相应的控件,以确保能够正确执行相应的功能。这些OCX控件通常由开发者或第三方提供,并根据需要引入谷歌浏览器中。一旦OCX控件加载成功,谷歌浏览器就能够使用该控件提供的功能,例如播放音频、视频、处理文件上传等。 在调用OCX控件时,谷歌浏览器会检查控件的完整性和安全性,以确保它不会对用户的计算机造成损害。这是出于安全考虑,以防止潜在的恶意代码对用户的计算机进行攻击或非法操作。 需要注意的是,有些OCX控件可能不被谷歌浏览器支持,或者由于安全限制而不容许使用。在这种情况下,用户可能需要通过其他方式来完成相应的功能,或者尝试使用其他浏览器来满足需求。 总之,谷歌浏览器能够调用OCX控件来扩展其功能,提供更好的用户体验和网页交互。这也体现了谷歌浏览器的灵活性和开放性,以适应不同用户的需求。 ### 回答2: 谷歌浏览器不支持直接调用OCX控件OCX控件(包括ActiveX控件)是一种用于Windows环境下的特殊组件,主要用于在网页中显示多媒体内容或执行其他特定任务。然而,由于谷歌浏览器采用了Chromium内核,该内核与传统的OCX控件不兼容,因此无法直接调用OCX控件。 为了解决这个问题,开发者可以考虑使用其他替代方案。例如,可以使用基于HTML5的原生Web浏览器 API来实现类似功能。HTML5提供了一系列的标准API,如Canvas、WebRTC、Web Audio等,可以用于实现图像处理、音视频播放等功能,从而不再依赖于OCX控件。 此外,如果必须使用OCX控件,用户可以考虑切换到支持OCX控件的浏览器,如Internet Explorer。在Internet Explorer中,用户可以直接调用和使用OCX控件,以实现特定功能。 总之,谷歌浏览器无法直接调用OCX控件,但开发者可以通过使用HTML5的相关API或切换到支持OCX控件的浏览器来实现类似的功能。 ### 回答3: 谷歌浏览器可以通过调用OCX控件实现一些特定功能。OCX(Object Linking and Embedding Control)是一个可重复使用的软件组件,它可以被嵌入在其他应用程序中,并提供特定的功能。 在谷歌浏览器中,当需要使用OCX控件时,首先需要在相关的网页或应用程序中引用该控件。通过添加控件的相关代码,谷歌浏览器就能够了解如何调用和使用该控件。 一旦OCX控件调用,谷歌浏览器可以利用该控件的特定功能。例如,如果OCX控件是用于媒体播放的,谷歌浏览器就能够播放网页上嵌入的音频或视频文件。如果OCX控件是用于动画或特效的,谷歌浏览器也能够展示出这些特效。 谷歌浏览器调用OCX控件的过程是通过调用接口、方法或事件来实现的。OCX控件会提供一系列的接口或方法,用于与谷歌浏览器进行交互。谷歌浏览器可以根据需要调用这些接口或方法,以实现业务逻辑的功能。 总结来说,谷歌浏览器调用OCX控件是通过添加需要使用的控件代码,并通过调用接口、方法或事件等方式与控件进行交互。这样可以为用户提供更丰富的浏览器功能和体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值