1、DLL:创建一个dll项目
一直点击下一步,直到创建完成。
2、DLL:dll项目有什么不同之处?
#ifndef SLD_H
#define SLD_H
#include "sld_global.h"
#include <QDebug>
class SLDSHARED_EXPORT Sld
{
public:
Sld();
QString GetStr();
};
#endif // SLD_H
看一下项目默认头文件sld.h的不同之处,发现在类名Sld前面添加了一个SLDSHARED_EXPORT的关键字,表示此类用于导出到DLL
在这里添加了一个GetStr方法。
下面是sld.cpp文件代码:
#include "sld.h"
Sld::Sld()
{
qDebug()<<"call sld constructor";
}
QString Sld::GetStr()
{
return "aa";
}
我们发现此类是简单类,没有继承于任何对象。下面我们创建一个基于界面控件的类,看是否行得通。
3、DLL:创建一个界面类MyDialog
如图这样创建一个对话框类,创建方式与普通工程类似:
我们发现新创建的类跟普通工程的类是一模一样的,为了能实现导出到DLL功能,我们要对mydialog.h做如下修改:
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
#include "sld_global.h"
namespace Ui {
class MyDialog;
}
// 这里增加了SLDSHARED_EXPORT
class SLDSHARED_EXPORT MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
~MyDialog();
private:
Ui::MyDialog *ui;
};
#endif // MYDIALOG_H
这里改动的只是增加一个SLDSHARED限定在类名前面,而cpp文件则无需改动:
#include "mydialog.h"
#include "ui_mydialog.h"
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
}
MyDialog::~MyDialog()
{
delete ui;
}
另外在ui界面拖入一个label,并写上文字标明此界面为来自dll的界面:
至此,测试的dll项目已经创建完成,发现编译不会通过,找不到QDialog,我们需要在.pro里面增加
QT +=widgets
另外,为了测试方便(把dll和调用方的输出exe放到同一个文件夹里),把路径改为新的地址而不是用默认地址,要在.pro文件增加:
#指定输出路径
DESTDIR =..\MyDebug
然后在项目里面去掉勾选输出路径:
4、DLL:用构建而非运行
不要用run,而要用构建,对项目右键点击构建:
构建完成即可看到在指定目录下已经生成sld.dll文件
5、调用:创建调用方测试项目
创建一个普通的桌面应用项目
6、调用:配置dll调用相关
#指定输出路径
DESTDIR =..\MyDebug
#把sld的项目文件夹包含到这里,这样就可以直接用里面的头文件
#在这里我把头文件单独拷贝到另一个文件夹,已证明并不需要cpp文件
INCLUDEPATH +=../sldHead
#添加dll
LIBS += ..\MyDebug\sld.dll
7、调用:增加一个按钮触发调用dll里的类
在按钮的槽里面增加以下代码:
void MainWindow::on_pushButton_clicked()
{
// 测试dll中的MyDialog类
MyDialog * my = new MyDialog(this);
my->show();
// 测试dll中的Sld类
Sld s;
QMessageBox * msg = new QMessageBox(this);
msg->setText(s.GetStr());
msg->show();
}
8、调用:查看效果
可以看到,dll内不管是ui还是普通的类都可以正常调用,就像在本程序里面一样
9、调用:项目结构
注意:当所有.h包含进来并编译之后,项目只剩下dll文件和exe文件,并不需要.h文件了。把文件夹内的exe和dll一起拷贝到任何地方都能运行。
本文参考了这篇文章,在此表示感谢:http://blog.csdn.net/cateatapple/article/details/51004780