一、环境介绍
操作系统: 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;
}