环境:
QT5.1
VS2010
为了方便VS中调试,需要将主程序和plugin的程序放在同一个解决方案中,否则无法单步调试。
步骤:
1、建立plugin工程,该工程为qtlibrary工程,工程中包括一个interface.h的头文件,该头文件定义一个接口类,可以定义所以的纯虚函数,可以没有构造函数,但是为了释放内存,建议有一个虚的析构函数。然后根据要求定义各个成员函数【虚函数】
2、定义完所有的函数后需要用Q_DECLARE_INTERFACE宏定义来定义接口,Q_DECLARE_INTERFACE(testinterface , "mxq.testlib.testinterface/1.0")第一个参数为类名,第二个参数为标示码,自己定义。
3、在创建工程的时候会自动生成一个.h文件为libplugin_global.h【如果libplugin为工程名称】,在libplugin.h文件中设计插件的类,该类继承QObject和interface类。
4、libplugin类定义的时候需要注意添加宏:Q_OBJECT,Q_PLUGIN_METADATA,Q_INTERFACES三个宏。其用户可以参考手册。
5、实现类成员函数。编译ok。
源码如下:
libplugin_global.h 是自动生成的,不需要进行改动,不做说明
testinterface.h源码========================》
#ifndef TESTINTERFACE_H
#define TESTINTERFACE_H
#include <QtPlugin>
#include <QObject>
#include <QString>
class testinterface:public QObject{
Q_OBJECT
public:
virtual ~testinterface(){};
virtual QString getName() = 0;
signals:
void reqTest(quint16 value);
};
Q_DECLARE_INTERFACE(testinterface , "mxq.testlib.testinterface/1.0")
#endif
libplugin.h源码========================》
#ifndef LIBPLUGIN_H
#define LIBPLUGIN_H
#include <QObject>
#include <QTimer>
#include "testinterface.h"
#include "libplugin_global.h"
class LIBPLUGIN_EXPORT libplugin: public QObject , public testinterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDummyPlugin" FILE "mxqtest.json")
Q_INTERFACES(testinterface)
public:
libplugin();
~libplugin();
virtual QString getName();
//signals:
//void reqTimeOut();
//void reqTest(quint16 value);
public slots:
void respTimeOut();
private:
QTimer *pTimer;
quint16 timeCount;
};
#endif // LIBPLUGIN_H
libplugin.c源码========================》
#include "libplugin.h"
#include <QtDebug>
#include <QString>
#include <QtPlugin>
libplugin::libplugin()
{
pTimer = NULL;
pTimer = new QTimer();
QObject::connect(pTimer , &QTimer::timeout , this , &libplugin::respTimeOut);
pTimer->start(5000);
timeCount = 0;
}
libplugin::~libplugin()
{
if (pTimer)
{
pTimer->deleteLater();
pTimer = NULL;
}
}
QString libplugin::getName()
{
qDebug()<< "get name function input :" ;
qDebug()<<"plugin name is \"libplugin\"";
return "libplugin";
}
void libplugin::respTimeOut()
{
timeCount++;
emit this->reqTest(timeCount);
}
创建测试主工程,该工程需要包含接口头文件interface.h。
调用QPluginLoader类中的函数加载.dll文件,然后使用qobject_cast将工程强制转换。
后期使用就和一般的对象一样使用。
testclass.h源码============================》
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include <QObject>
class TestClass : public QObject
{
Q_OBJECT
public:
TestClass(QObject *parent=0);
~TestClass();
public slots:
void respValue(quint16 value);
private:
};
#endif // TESTCLASS_H
testclass.c源码============================》
#include "testclass.h"
#include <QtDebug>
TestClass::TestClass(QObject *parent)
: QObject(parent)
{
}
TestClass::~TestClass()
{
}
void TestClass::respValue( quint16 value )
{
qDebug()<<"value = "<<value;
}
#include <QtCore/QCoreApplication>
#include <QLibrary>
#include <QObject>
#include <QPluginLoader>
#include <QDir>
#include <QtDebug>
#include "testinterface.h"
#include "testclass.h"
main.c源码=========================================》
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//QDir pluginsDir(QDir(a.applicationDirPath())
// .canonicalPath()
// .append(QDir::separator())
// .append("plugins"));
//foreach (QString fileName, pluginsDir.entryList(QDir::Files))
//{
// qDebug()<<fileName;
// qDebug()<<pluginsDir.absoluteFilePath(fileName);
//}
TestClass *test = new TestClass();
QPluginLoader *pPlugin = new QPluginLoader("libplugin.dll");
qDebug()<<pPlugin->errorString();
if (pPlugin->load())
{
qDebug()<<"load ok!";
}
QObject *pObj = pPlugin->instance();
if (pObj)
{
testinterface *pinterface;
pinterface = qobject_cast<testinterface *>(pObj);
QObject::connect(pinterface , &testinterface::reqTest,test , &TestClass::respValue);
qDebug()<<pinterface->getName();
}
return a.exec();
}
以上为本人简单的测试程序,加载和调用插件没有问题,但是别的程序bug不考虑。仅供参考。。。。