您的位置:首页 > 编程语言 > Qt开发

Qt 插件 V4

2017-01-05 18:02 169 查看
qt插件在windows下就是态链接库,或者说静态链接库。(dll lib) 下文统称为qt插件。

主程序不需要lib文件就可以使用qt插件,并且可以编译成功;有点类似于动态加载dll。

4.8.7\examples\tools\echoplugin

1). 定义接口

class EchoInterface
{
public :
virtual ~EchoInterface(){}
virtual QString echo(const QString &msg) = 0;

};

Q_DECLARE_INTERFACE(EchoInterface, "EchoInterface")

Q_DECLARE_INTERFACE(EchoInerface, "EchoInterface")

接口类名                   接口文本名字(任意 区分其他接口)

2)定义插件  插件了实现接口中的函数

#include "echointerface.h"
class EchoPlugin: public QObject, EchoInterface
{
Q_OBJECT
Q_INTERFACES(EchoInterface)
public:
QString echo(const QString &msg);
};       Q_INTERFACES(EchoInterface)    表明该插件实现的是哪个接口
接口类名

#include "echoplugin.h"
#include <QtGui>

QString EchoPlugin::echo(const QString &msg)
{
return msg;
}

Q_EXPORT_PLUGIN2(echoplugin, EchoPlugin)    Q_EXPORT_PLUGIN2(echoplugin, EchoPlugin)  表明导出的lib文件 dll文件名是什么 以及插件类是哪个
文件名           插件类名

3)使用插件

EchoInterface *interface; // 接口指针

bool load()
{
QDir pluginDir("."); // 准备在当前文件夹查找 dll 插件文件

foreach(QString filename, pluginDir.entryList(QDir::Files))
{
qDebug()<<filename;
QPluginLoader loader(pluginDir.absoluteFilePath(filename)); // 加载每个文件
QObject *plugin = loader.instance(); // 返回实例对象
if(plugin)
{
interface = qobject_cast<EchoInterface*>(plugin); // 若属于EchoInterface接口,则表明插件存在
if(interface)
return true;
}
}

return false;
qDebug()<<"failed to load";
}

interface->echo("message"); // 插件存在 则可以直接调用其函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息