前面我们讲到在VC中直接使用Qt,这种方法将Qt和VC代码混在一起,感觉不伦不类,更好的方法是将这些界面封装在库中,vc通过加载dll的方式来使用。
1.首先创建一个win32 项目-》选择动态库-》完成
将前面工程的EdbParamaUi.h EdbParamaUi.cpp moc_EdbParamaUi.cpp拷贝到该工程中并加入工程。
2. 编写导出函数
编译运行生成库。
3.测试工程我们使用前面的几节的工程修改代码如下:
oid CMFCApplication4Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//QMessageBox::information(NULL, QStringLiteral("这是Qt消息框"), QStringLiteral("这是Qt消息框"));
//这里测试我给的绝对路径
HMODULE mod = LoadLibrary(_T("E:/work/QuotationExcelUi/Debug/QuotationExcelUi.dll"));
//这个是测试Qt生成的Dll的部分,先动态载入,再使用导出的函数
if (mod)
{
typedef void(*pShowDialog)(HWND parent);
pShowDialog showDialog = (pShowDialog)GetProcAddress(mod, "ShowEdbParamaUi");
if (showDialog)
showDialog(NULL);
FreeLibrary(mod);
}
}
然后将先前添加的Qt代码都注销(因为一个进程只能有一个QApplication对象)
4.运行该工程
出现找不到QtCore.dll文件。
我们将Qt安装目录下bin目录下的所有文件拷贝到这个工程的exe文件的目录。
再次运行 点击按钮
·
成功
但是这里需要将Qt的库拷贝奥目录 要是有多个exe掉用这个dll 每个exe都得带上一份Qt库,这显然不符合正常逻辑, 解决办法将Qt 库目录添加到环境变量中:
重启vs 并删掉 该目录的Qt 库 重新运行发现成功运行了。
自此这2种方法应该可以满足一般的开发需要了,至于要在Qt使用MFC 思路也基本一致,如果你的Qt版本在5.0以下建议使用qtwinmigrate-2.8_1去实现。