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"); // 插件存在 則可以直接調用其函數