QT应用编程: windows下QT调用COM组件并集成到QT界面

2022-01-07 14:27:35 浏览数 (1)

一、环境介绍

操作系统: win10 64位

QT版本: 5.12.6

Visual Studio IDE 版本: 2017

二、创建COM组件

为了方便测试,我这里使用QT来创建COM组件,再由QT自己调用。 理论上任何语言生成的COM组件调用流程应该都是一样的。

QT创建COM的方法看这里:

(1) VS2017下使用QT生成COM组件: https://blog.csdn.net/xiaolong1126626497/article/details/112556866

(2) QtCreate下生成COM组件: https://blog.csdn.net/xiaolong1126626497/article/details/112550412

本次文章是接着上一篇文章写的,创建的COM组件可以参考上一篇文章:

QT应用编程: windows下QT调用COM组件: https://blog.csdn.net/xiaolong1126626497/article/details/112978956

三、QtCreate里创建工程调用COM组件完成界面开发

上一篇文章里介绍了在QtCreate里使用QAxObject调用COM组件,并完成函数接口调用;如果调用的COM组件是带界面的程序,并需要集成到当前QT程序中,就需要使用QAxWidget实现。

3.1 方式1

直接在工程里写代码,new一个QAxWidget并添加到布局器即可。代码里都有注释。

这里的工程采用的上一篇文章的工程 ,链接: https://blog.csdn.net/xiaolong1126626497/article/details/112978956

代码语言:javascript复制
    QAxWidget *ax_widget = new QAxWidget(nullptr,nullptr);
    ax_widget->resize(500,500);

    //指定调用的COM组件类ID,这个ID要填正确.
    ax_widget->setControl(QString::fromUtf8("{fe8bb3a1-998e-4318-b4ee-4263a1cc06a2}"));

    //导出支持调用的函数接口
    QString DOC = ax_widget->generateDocumentation();
    QFile outFile("com_function.html");
    outFile.open(QIODevice ::ReadWrite|QIODevice ::Text);
    QTextStream TS(&outFile);
    TS<<DOC<<endl;

    //调用com组件开放的函数:  查看COM组件版本号
    QString result;
    result=ax_widget->dynamicCall("VersionNumber()").toString();
    qDebug()<<"插件的版本号:"<<result;

    //调用com组件开放的函数: 加载视频文件
    QVariantList params;
    params={100,100};
    int val=ax_widget->dynamicCall("sum(int,int)", params).toInt();
    qDebug()<<"求和运算:"<<val;

    //新建布局
    QHBoxLayout *layout = new QHBoxLayout;
    //添加ax_widget到布局器
    layout->addWidget(ax_widget);
    //设置当前页面布局
    this->setLayout(layout);

代码写完之后,直接运行即可。 注意: 运行代码之前,COM组件一定要先注册才能调用。

3.2 方式2

为了方便界面设计,这可以直接在UI设计师界面,拖一个axWidget控件出来。

注意: 下面图片里,右键选择的COM组件,必须要先注册成功之后才能看到。

代码块:

代码语言:javascript复制
#include "com_widget.h"
#include "ui_com_widget.h"

com_widget::com_widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::com_widget)
{
    ui->setupUi(this);

    QAxWidget *ax_widget = ui->axWidget;
    
    //指定调用的COM组件类ID,这个ID要填正确.
    ax_widget->setControl(QString::fromUtf8("{fe8bb3a1-998e-4318-b4ee-4263a1cc06a2}"));

    //导出支持调用的函数接口
    QString DOC = ax_widget->generateDocumentation();
    QFile outFile("com_function.html");
    outFile.open(QIODevice ::ReadWrite|QIODevice ::Text);
    QTextStream TS(&outFile);
    TS<<DOC<<endl;

    //调用com组件开放的函数:  查看COM组件版本号
    QString result;
    result=ax_widget->dynamicCall("VersionNumber()").toString();
    qDebug()<<"插件的版本号:"<<result;

    //调用com组件开放的函数: 加载视频文件
    QVariantList params;
    params={100,100};
    int val=ax_widget->dynamicCall("sum(int,int)", params).toInt();
    qDebug()<<"求和运算:"<<val;
}

com_widget::~com_widget()
{
    delete ui;
}

0 人点赞