• 【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数据结构。数据类型对照表将放置在本文最后。下面是摘抄的官方示例:

    1. dispinterface IControl
    2. {
    3. properties:
    4.     [id(1)] BSTR text;
    5.     [id(2)] IFontDisp *font;
    6. methods:
    7.     [id(6)] void showColumn([in] int i);
    8.     [id(3)] bool addColumn([in] BSTR t);
    9.     [id(4)] int fillList([in, out] SAFEARRAY(VARIANT) *list);
    10.     [id(5)] IDispatch *item([in] int i);
    11. };
    12. QAxObject object("");
    13. QString text = object.property("text").toString();
    14. object.setProperty("font", QFont("Times New Roman", 12));
    15. connect(this, SIGNAL(clicked(int)), &object, SLOT(showColumn(int)));
    16. bool ok = object.dynamicCall("addColumn(const QString&)", "Column 1").toBool();
    17. QList varlist;
    18. QList parameters;
    19. parameters << QVariant(varlist);
    20. int n = object.dynamicCall("fillList(QList&)", parameters).toInt();
    21. 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来加载。

    1.     callocx = new QAxWidget(parent);
    2.     callocx->setControl(QString::fromUtf8("{21D328F3-B846-4a1e-9130-159163EC26D4}"));
    3.     callocx->setProperty("Visible",true);
    4.     callocx->show();
    5.     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&

  • 相关阅读:
    从 NASL 说开:低代码编程语言能饭否
    C语言 | Leetcode C语言题解之第329题矩阵中的最长递增路径
    21天学会C++:Day12----初始化列表
    GB/T 28181联网系统通信协议结构和技术实现
    Flink SQL时间属性和窗口介绍
    【C+】C++11 —— 线程库
    【微服务|SCG】Spring Cloud Gateway快速入门
    打不开clickonce问题解决过程
    解决前端性能问题:如何优化大量数据渲染和复杂交互?
    Java的File文件操作案例汇总
  • 原文地址:https://blog.csdn.net/Flywithdawn/article/details/126638849