打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用qt5&VS2010设计插件的一般方法
环境:
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不考虑。仅供参考。。。。
 
 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
QThread 与 QObject的关系
深入Qt 学习 -- 反射机制
Qt 字符串(QString)、信号与槽(QObject)详细篇
WebKit 学习笔记(5) -- qt javascript 扩展 - 浏览器研究 - ...
Qt——线程与定时器
<ZT>理解Qt多线程类 - yanboo's blog - 歪酷
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服