环境说明
Qt版本:5.12 Mingw32
操作系统:win10
嵌入的原因
使用某公司提供的数据采集相关的动态链接库,但该链接库在VS下可正常运行,而在Qt下却无法运行。苦于项目申请书中已经说明,该项目的软件需使用Qt进行开发,不得已才出此下策。在VS下使用MFC调用动态连接库进行数据的采集,将MFC的界面进行打包后使用Qt调用,并MFC的界面嵌入到Qt中,实现应有功能。
操作过程
1、将MFC编译的exe即相关的动态链接库文件复制到Qt编译的工程目录下。
2、确定MFC文件的窗口的相关信息。打开VS的spy++工具和需要嵌入的MFC的exe文件窗口,并入图拖动获取,类或标题名称即可。
3、使用以下代码。
QProcess myProcess(this);
QString program = "CPPClientSDKDemo.exe";
myProcess.startDetached(program);
Sleep(50);
HWND wid= FindWindow(NULL,L"ClientSDK调用Demo");
//NULL处可填写类名,"ClientSDK调用Demo"处填写的是标题,两者只需要一项即可。
QWindow *m_window;
m_window =QWindow::fromWinId((WId)wid);
m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
QWidget *m_widget;
QWidget *bottom=new QWidget();
m_widget = QWidget::createWindowContainer(m_window,bottom,Qt::FramelessWindowHint);
QVBoxLayout *layout1=new QVBoxLayout();
layout1->addWidget(m_widget);
ui->widget->setLayout(layout1);
//setCentralWidget(m_widget);
//如果采用全窗口显示,取消这一句的注释即可
4、效果展示,点击按钮即可在widget中嵌入MFC窗口。
总结
项目开始前一定要注意尽量用一种软件进行开发,VS或者Qt都没有问题,不要等到项目做到一半要进行程序的结合是才发现不兼容,那样问题就太严重了。不兼容是一个非常恐怖也非常费时间的问题。希望以后做项目之前能多注意一下,尽量不要再用到这篇博客的内容。