通过插件使应用程序可扩展涉及以下步骤:
- 定义一组用于与插件对话的接口(仅具有纯虚函数的类)。
- 使用
Q_DECLARE_INTERFACE()
宏向Qt的元对象系统声明该接口。 - 在应用程序中使用
QPluginLoader
加载插件。 - 使用
qobject_cast()
测试插件是否实现了给定的接口。
class EchoInterface{ //! [1]
public:
virtual ~EchoInterface() = default;
virtual QString echo(const QString &message) = 0;
};
QT_BEGIN_NAMESPACE
#define EchoInterface_iid "org.qt-project.Qt.Examples.EchoInterface"
Q_DECLARE_INTERFACE(EchoInterface, EchoInterface_iid)//! [2]
QT_END_NAMESPACE
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));//! [3]
QObject *plugin = pluginLoader.instance();
if (plugin) {
echoInterface = qobject_cast<EchoInterface *>(plugin);//! [4]
if (echoInterface)
return true;
pluginLoader.unload();
}
编写一个插件的步骤:
- 声明一个插件类,该类继承自QObject和该插件要提供的接口。
- 使用Q_INTERFACES] ()宏告诉Qt的元对象系统有关接口的信息。
- 使用Q_PLUGIN_METADATA()宏导出插件。
- 使用合适的.pro文件构建插件。
class EchoPlugin : public QObject, EchoInterface{ //! [1]
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EchoInterface" FILE "echoplugin.json") //! [2]
Q_INTERFACES(EchoInterface) //! [3]
public:
QString echo(const QString &message) override;
};
[1]Qt插件创建及加载
[2]Qt插件中的几个宏