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

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

  • 关于调用的说明
  • 调用过程
    • 生成需要被调用的包含QT界面dll
      • 生成平台
      • 生成过程
    • MFC调用上述dll
    • consle调用上述dll

关于调用的说明

不要去管网上各种大神说的需要什么什么库,那是瞎折腾!!!

调用过程

生成需要被调用的包含QT界面dll

生成平台

生成所用编译器:VS2010
生成所用QT版本:QT4.8.7
据推测,应该不用限定平台,VS的各种版本应该都可以,QT也是不需要指定具体的版本。

生成过程

1.创建QT动态库
QT界面动态库的跨平台调用_第1张图片

2 勾选选择GUI库,方便后面添加窗体
QT界面动态库的跨平台调用_第2张图片

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

4 添加UI窗体到工程
QT界面动态库的跨平台调用_第4张图片

QT界面动态库的跨平台调用_第5张图片

5 输入界面类名称,方便后面调用
QT界面动态库的跨平台调用_第6张图片

6 最终项目结果
QT界面动态库的跨平台调用_第7张图片

7 添加QT窗体控件
QT界面动态库的跨平台调用_第8张图片

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("测试调用成功!"));
}

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();
}

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();
	}
}

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

3 编译,运行即可

QT界面动态库的跨平台调用_第9张图片

consle调用上述dll

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

你可能感兴趣的:(技术)