转自https://blog.csdn.net/leegean/article/details/83114438
QT界面动态库的跨平台调用
2018年10月17日 17:37:45 Junrrye 阅读数:140
QT界面动态库的跨平台调用
关于调用的说明
不要去管网上各种大神说的需要什么什么库,那是瞎折腾!!!
调用过程
生成需要被调用的包含QT界面dll
生成平台
生成所用编译器:VS2010
生成所用QT版本:QT4.8.7
据推测,应该不用限定平台,VS的各种版本应该都可以,QT也是不需要指定具体的版本。
生成过程
1.创建QT动态库
2 勾选选择GUI库,方便后面添加窗体
3 采用默认的即可,勾选预编译与否问题不大,我这里没有勾选
4 添加UI窗体到工程
5 输入界面类名称,方便后面调用
6 最终项目结果
7 添加QT窗体控件
8 添加QT消息及槽函数
打开 QInvokeUI.cpp文件添加如下代码
#include "QInvokeUI.h"
#include <QMessageBox>
QInvokeUI::QInvokeUI(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(showMessageInThis()));
connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(close()));
}
QInvokeUI::~QInvokeUI()
{
}
void QInvokeUI::showMessageInThis()
{
QMessageBox::information(nullptr,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("测试调用成功!"));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
9 添加调用代码
打开testqtdll.cpp文件,添加如下调用代码
// An highlighted block
#include "testqtdll.h"
#include "QInvokeUI.h"
#include <qtGui/qtgui>
#include <QtGui/QApplication>
testqtDll::testqtDll()
{
}
testqtDll::~testqtDll()
{
}
//注意这个函数非常重要
//因为:qt界面运行必须有调用QApplication 的 exec 方法,这样才能产生消息循环。
extern "C" TESTQTDLL_EXPORT int testinvokeUI(int argc)
{
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
char* b="abc";
QApplication a(argc, &b);
QInvokeUI w;
w.show();
return a.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
10 编译生成代码
MFC调用上述dll
1 添加调用代码
好了,上面主要生成的动作完成了,调用就简单了。
这里略过MFC工程的创建,按钮响应消息函数的生成。
直接在按钮点击响应函数中写上如下代码
void CtestInvokeQtUIDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HMODULE mod = LoadLibrary(_T( "testqtDll.dll" ));//这个dll名称与上面生成的dll同名
DWORD err= GetLastError();
if ( mod ) {
typedef int (*FunctionPtr)(int argc);
FunctionPtr pFunc= (FunctionPtr)GetProcAddress(mod,"testinvokeUI");
pFunc(0);
FreeLibrary( mod );
} else {
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
2 拷贝QT运行动态库文件,注意这个非常关键
将qt安装目录下bin目录下的所有dll文件都拷贝到当前MFC程序生成的exe目录下(这里也许只需拷贝部分即可,但是具体仅仅需要哪些,我没有去一一验证,为了省事,都拷贝反正不会有错就是)
3 编译,运行即可
consle调用上述dll
调用方法与上面的MFC调用是一致,包括在其他平台也是。笔者在CATIA CAA中采用上述方法成功调用了。在此就不在赘述。