转载QT界面动态库的跨平台调用

时间:2024-03-19 16:15:25

转自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动态库
转载QT界面动态库的跨平台调用

2 勾选选择GUI库,方便后面添加窗体
转载QT界面动态库的跨平台调用

3 采用默认的即可,勾选预编译与否问题不大,我这里没有勾选
转载QT界面动态库的跨平台调用

4 添加UI窗体到工程
转载QT界面动态库的跨平台调用

转载QT界面动态库的跨平台调用

5 输入界面类名称,方便后面调用
转载QT界面动态库的跨平台调用

6 最终项目结果
转载QT界面动态库的跨平台调用

7 添加QT窗体控件
转载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

拷贝QT运行动态库文件,注意这个非常关键
将qt安装目录下bin目录下的所有dll文件都拷贝到当前MFC程序生成的exe目录下(这里也许只需拷贝部分即可,但是具体仅仅需要哪些,我没有去一一验证,为了省事,都拷贝反正不会有错就是)

3 编译,运行即可

转载QT界面动态库的跨平台调用

consle调用上述dll

调用方法与上面的MFC调用是一致,包括在其他平台也是。笔者在CATIA CAA中采用上述方法成功调用了。在此就不在赘述。