1甩苛、 接口的定義
//step 1 定義接口
class RegExpInterface
{
public:
virtual ~RegExpInterface() {}
virtual QString regexp(const QString &message) = 0;
};
// step 2
// 聲明接口
// 使用 Q_DECLARE_INTERFACE 宏,是為了讓Qt元對象系統(tǒng)知道該接口,這樣以來,在運行時便可以識別實現(xiàn)接口的插件喇颁。
// Q_DECLARE_INTERFACE(接口類名, 接口標識),第二個參數(shù)(RegExpInterface_iid)是一個標識接口的字符串,必須唯一嚎货。
#define RegExpInterface_iid "org.qter.Examples.myplugin.RegExpInterface"
Q_DECLARE_INTERFACE(RegExpInterface,RegExpInterface_iid )
#endif // REGEXPINTERFACE_H
2橘霎、接口的實現(xiàn)
//step 3 實現(xiàn)接口
class REGEXPLUGINSHARED_EXPORT RegexPlugin : public QObject,RegExpInterface
{
Q_OBJECT
//Q_PLUGIN_METADATA宏用于描述插件元數(shù)據(jù),第一個參數(shù)為插件的 IID殖属,與接口定義的IID相同
//第二個參數(shù)FILE是可選的姐叁,指定一個本地json文件,該文件中可以描述插件的相關數(shù)據(jù)信息
Q_PLUGIN_METADATA(IID RegExpInterface_iid FILE "regexplugindata.json")
//Q_INTERFACES 宏用于告訴 Qt 該類實現(xiàn)的接口洗显。
Q_INTERFACES(RegExpInterface)
public:
RegexPlugin();
// RegExpInterface interface
public:
QString regexp(const QString &message);
};
3外潜、接口的使用
// 進入插件目錄
QDir pluginsDir(qApp->applicationDirPath());
pluginsDir.cd("bin");
// 遍歷插件目錄
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = pluginLoader.instance();
if (plugin) {
//取回json文件的內容
QJsonObject w = pluginLoader.metaData().value("MetaData").toObject();
qDebug()<<w;
regexpInterface = qobject_cast<RegExpInterface *>(plugin);
if (regexpInterface)
return true;
}
}
return false;