最近做项目用Qt生成Ocx供MFC调用,经历坎坷,问题不断。。这下面详细给出Qt生成ocx的避坑指南,
一、Qt生成OCX
本人使用的是Qt5.9 + VS2015 ,用VS生成比较简单,VS上装上Qt的插件,然后新建项目->选择Qt5 Projects 选择最后一个ActiveQt Server,然后就可以生成如下图:编译就会生成Ocx.
二、Qt使用OCX
Qt使用ocx有两种方法:
一是使用QAxWidget,当然使用时先注册Ocx, 直接在designed中拖入双击选择Ocx控件,AxWidget就会加载Ocx,在代码dynamicCall()传入函数原型和参数调用使用接口,如果不用Designed在代码中直接写,使用setControl设置OCX 的uuid,具体查看uuic,可以参考https://blog.csdn.net/fxbjye/article/details/85102083的博客,这里不赘述,我也是参考各位大神的方法解决问题的.代码如下所示:
QAxWidget *flash = new QAxWidget(0,0);
flash->setControl(QStringLiteral("{f53b7748-643c-4a78-8dbc-01a4855d1a10}"));
flash->dynamicCall("openFile(QString, QString)", "../abc.pdf", "");
第二种方法比较好用,再使用较多接口使用dynamicCall调用不太方便,使用Qt提供了dumpcpp.exe,用来对指定的COM接口生成.h和.cpp文件,命令也很简单传入COM组件的UUID即可,形如"dumpcpp.exe {00000000-0000-0000-0000-000000000000}" ,然后在当前目录下就会生成对应的.h和.cpp文件了。dumpcpp.exe一般在Qt安装目录bin下,之后就可以正常使用接口了。
三、MFC使用Qt OCX的坑
MFC使用Qt的OCX会出现坐标位置不对的情况,在MFC中使用Qt生成的ocx时,生成接口文件生成.h和.cpp文件时,会报错QRect错误,这里貌似时由于MFC中坐标转换不正确导致的,将QRect改为CRect,即可编译通过。在Qt的Ocx中使用QComboBox时会出问题,MFC中由于坐标转换不正确导致QCombobox的下拉框弹出位置一直不正确。在使用QWebEngineView时多次置空网址,可能会导致崩溃,需要加以处理,并清理缓存。
综上所述,使用Qt的Ocx是个大坑,能避开则避开,非要使用也请注意这些问题。
Qt OCX问题解决: