Vs2008+qt4.7.2
一、系统设定:编写程序时只要按照正常的步骤就好了,生成的是可执行文件,当需要将其改为插件时,做如下操作:
1、 在项目属性—常规---配置类型,由原来的“应用程序(.exe)”,改为“动态库(.dll)”
2、 链接器—常规---输出文件,改为$(OutDir)/XXX.dll
二、代码编写
1、右键点击解决方案---添加---新建项目,建立一个新的test工程,作为测试用
2、在原有工程上新建一个接口类
(.h)文件中:
#ifndef WallEditPlugin_H
#define WallEditPlugin_H
#include <QtGui>
class WallEditPlugin
{
public:
virtual void init(QWidget *parent=0);
virtual void show();
virtual void hide();
virtual void Release();
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(WallEditPlugin,"WallEditPluginDLL/1.0"); //这个宏用声明接口。对应//Q_INTERFACES(WallEditPlugin)
// 用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统
QT_END_NAMESPACE
#endif
(.cpp)文件中:
#include "WallEditPlugin.h"
void WallEditPlugin::init(QWidget *parent){}
void WallEditPlugin::show(){}
void WallEditPlugin::hide(){}
void WallEditPlugin::Release(){}
建一个插件的出口
#ifndef MainExports_H
#define MainExports_H
#include "WallEditPlugin.h"
#include "../SRC/walleditor.h"
#include <QtPlugin>
#include <QObject>
class MainExports : public QObject,WallEditPlugin
{
Q_OBJECT
Q_INTERFACES(WallEditPlugin)
public:
void init(QWidget *parent=0);
void show();
void hide();
void Release();
WallEditor *w;
};
#endif
(.Cpp)
#include "MainExports.h"
#include <QtGui/QApplication>
#include <QTextCodec>
void MainExports::init(QWidget *parent){w= new WallEditor(parent);}
void MainExports::show(){w->show();}
void MainExports::hide(){w->hide();}
void MainExports::Release(){delete w;}
Q_EXPORT_PLUGIN2(WallEdit, MainExports); //这个宏用来导出动态链接库
// Q_EXPORT_PLUGIN2 ( PluginName,ClassName )
编译得到dll文件
三、调用,只需要一个.h文件和一个.dll文件
在test的构造函数中加入下面代码
#include "WallEditPlugin.h"
WallEditPlugin *WM;
QDir pluginsDir(qApp->applicationDirPath());
QString DLLPath= pluginsDir.absoluteFilePath("WallEditor.dll");
QPluginLoader pluginLoader(DLLPath);
QObject *plugin = pluginLoader.instance();
if (plugin)
{
WM=qobject_cast<WallEditPlugin *>(plugin);
WM->init(this);
WM->show();
}