一、首先新建一个Qt动态库工程(*.dll)
-
选择新建Libray=>C++ Libray项目
-
因为我需要带ui界面的dll,所以依赖库这里选择Widgets(这里默认的是core,后面在项目的.pro文件中可以通过
Qt += core widgets
来添加相关的依赖)
-
编译环境根据需要选择就好
-
完成创建
-
创建完成之后默认的文件目录是这样的:包含四个文件,.pro文件就不多所了,都知道是什么,可以看到QtCreator默认给我们创建了一个类,.h文件和.cpp文件都有,UNTITLEDDLL_GLOBAL_H文件是动态库导出相关的东西,我们可以将里面的东西拿出来用。
-
要想dll中的类能被其他程序调用,就需要加上导出宏也就是上面看到的
UNTITLEDDLL_GLOBAL_H
文件中的内容:
-
这里为了方便,我把这里面的东西取出来将相应的代码放到要导出的类上面,并稍作修改(具体改了哪里通过下面我修改好的类
UntitledDLL
头文件自行对比即可知晓),如下。这样我们就不需要UNTITLEDDLL_GLOBAL_H
文件了,可以将其删除。#ifndef UNTITLEDDLL_H #define UNTITLEDDLL_H //添加的UNTITLEDDLL_GLOBAL_H文件的内容到UntitledDLL类中,导出此类需要的宏,注意修改的内容=====================================================================>>> //#ifndef UNTITLEDDLL_GLOBAL_H //#define UNTITLEDDLL_GLOBAL_H #if defined(UNTITLEDDLL_LIBRARY) # define UNTITLEDDLL_EXPORT __declspec(dllexport) #else # define UNTITLEDDLL_EXPORT __declspec(dllexport) #endif //=====================================================================>>> class UNTITLEDDLL_EXPORT UntitledDLL { public: UntitledDLL(); }; #endif // UNTITLEDDLL_H
-
添加ui界面,跟普通的添加界面方法一致。
-
在新建的ui类头文件中加入上述宏定义
//#ifndef FORM1_H //#define FORM1_H //=====================================================================>>> #ifndef UNTITLEDDLL_GLOBAL_H #define UNTITLEDDLL_GLOBAL_H #ifdef UNTITLEDDLL_LIBRARY #define FORM1_EXPORT __declspec(dllexport) #else #define FORM1_EXPORT __declspec(dllimport) #endif //=====================================================================>>> #include <QMainWindow> namespace Ui { class Form1; } class Form1 : public QMainWindow { Q_OBJECT public: explicit Form1(QWidget *parent = nullptr); ~Form1(); private: Ui::Form1 *ui; }; #endif // FORM1_H
-
定义MFC调用ui界面的导出函数,创建QApplication消息循环
untitleddll.h
#ifndef UNTITLEDDLL_H #define UNTITLEDDLL_H //#ifndef UNTITLEDDLL_GLOBAL_H //#define UNTITLEDDLL_GLOBAL_H #if defined(UNTITLEDDLL_LIBRARY) # define UNTITLEDDLL_EXPORT __declspec(dllexport) #else # define UNTITLEDDLL_EXPORT __declspec(dllexport) #endif class UNTITLEDDLL_EXPORT UntitledDLL { public: UntitledDLL(); }; extern "C" UNTITLEDDLL_EXPORT int testFormUI(int argc, char* argv[]); #endif // UNTITLEDDLL_H
untitleddll.cpp
#include "untitleddll.h" #include "form1.h" #include <QApplication> UntitledDLL::UntitledDLL() { } /** MFC中调用界面必须要先调用此函数,因为qt界面运行必须有调用QApplication的exec 方法,这样才能产生消息循环。 */ extern "C" UNTITLEDDLL_EXPORT int testFormUI(int argc, char* argv[]) { QApplication a(argc, argv); Form1 f; f.show(); return a.exec(); }
-
编译生成dll,此例子在debug模式下编译。生成如下文件.lib和.dll文件,也就是我们需要的导入库和动态库了,接下来我们就可以拿着这两个文件和对应的类头文件去MFC调用了。
二、在MFC中调用QT动态库
-
准备工作:
将生成的动态库文件(.dll)放到MFC的编译目录下,也就是exe所在的那个目录,跟上面qt中的debug目录一个道理。
将生成的.lib放在程序文件夹下,也就是MFC项目的根目录,你的MFC类文件的同文件下。
将.h也放到程序文件夹中 -
引入头文件
#include "untitleddll.h" #pragma comment(lib,"untitledDLL.lib")
这里需要注意的是,头文件和.lib文件可以以路径的形式导入,不是必须放在类路径下的,例如:
#include "D:\\untitleddll\\untitleddll.h"
#pragma comment(lib,"D:\\build-untitledDLL-Desktop_x86_windows_msvc2017_pe_64bit-Debug\\debug\\untitledDLL.lib")
-
在需要的地方调用导出函数既可
//调用Qt导出函数进入Qt的界面消息循环,打开qt窗口 testFormUI(0,0);