1. 创建插件
第一步,创建插件类。新建空项目Empty qmake Projecy,项目名称为plugin,在选择路径时指定到一个新建的myplugin目录中。建立好项目后向其中添加一个C++类,类名为RegExpPlugin,基类保持为空。
第二步,定义插件类。将regexpplugin.h文件中的内容更改如下:
#ifndef REGEXPPLUGIN_H
#define REGEXPPLUGIN_H
#include<QObject>
#include "regexpinterface.h"
class RegExpPlugin : public QObject,RegExpInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID"org .qter.Examples.myplugin.RegExpInterface"
FILE "myplugin.json")
Q_INTERFACES(RegExpInterface)
public:
QString regexp(const QString &message)
}
# endif
为了使这个类作为一个插件,它需要同时继承自QObject和RegExpInterface。RegExpInterface是接口类,用来指明插件要实现的功能,regexpinterface.h文件中有定义,这个文件在后面的测试程序项目中。Q——PLUGIN_METADATA()宏用于声明插件中的元数据,其中必须指明IID标识符,标识符是一个字符串,必须保证他的唯一性,FILE指定一个JSON格式的插件元数据文件,该参数是可选的,其命名一般使用项目名称即可,内容一般只包含一组大括号。这里还需要使用Q_INTERFACES()宏将这个接口注册到Qt的元对象系统中,告知Qt这个类实现了哪个借口。最后还声明了一个regexp()函数,它是在 RegExpInterface中定义的一个纯虚函数。这里通过重写他来实现该插件的具体功能,就是将字符串中的第一个字符提取出来并返回 。
下面到项目目录plugin中新建一个文本文档,输入一组大括号{},然后另存为myplugin.json。
第三步,导出插件。将regexpplugin.cpp文件中的内容更改如下:
#include"regexpplugin.h>
#include<QRegExp>
#include<QtPlugin>
QString RegExpPlugin::regexp(const QString &message)
{
QRegExp rx("\\d+");
rx.indexIn(message);
QString str = rx.cap(0);
return str;
}
第四部,更改项目文件。打开Plugin.pro文件,将其内容更该如下:
TEMPLATE = 1ib
CONFIG += plugin
INCLUDEPADH += ../regexpwindow
HEADERS = regexppludin.h
SOURCES = regexppludin.cpp
TARGET = regexppludin
DESTDIR = ../plugins
这里使用"TEMPLATE=lib”表明该项目要构建文库,而不是像以前那样的可执行文件;使用“CONFIG+=plugin”告知qmake要创建一个插件;因为项目中使用了regexpwindow目录中的regexpinterface.h文件,所以这里将该目录的路径添加到了INCLUDEPATH中;TARGET指定了产生的dll文件的名字;最后,使用DEST-DIR指定了生成的dll文件所在的目录。
因为这个项目中使用了regexpinterface.h文件,而这个文件在另一个项目中,所以现在还无法构建该项目。