插件管理器类
class 扩展系统::插件管理器插件管理器类实现了核心插件系统,负责管理插件、它们的生命周期以及它们注册的对象。 更多信息...
头文件 | #include <扩展系统/pluginmanager.h> |
继承 | QObject |
公共函数
插件管理器() |
静态公共成员
void | 增加对象(QObject *obj) |
QVector<QObject *> | allObjects() |
QStringList | arguments() |
QStringList | argumentsForRestart() |
void | 格式化选项(QTextStream &str, int optionIndentation, int descriptionIndentation) |
void | 格式化插件选项(QTextStream &str, int optionIndentation, int descriptionIndentation) |
void | 格式化插件版本(QTextStream &str) |
T * | getObject() |
T * | 获取对象(Predicate predicate) |
QObject * | 按名称获取对象(const QString &name) |
Utils::QtcSettings * | globalSettings() |
bool | hasError() |
ExtensionSystem::PluginManager * | instance() |
void | loadPlugins() |
QVector<ExtensionSystem::PluginSpec *> | loadQueue() |
bool | 解析选项(const QStringList &args, const QMap<QString, bool> &appOptions, QMap<QString, QString> *foundAppOptions, QString *errorString) |
QString | pluginIID() |
Utils::FilePaths | pluginPaths() |
const QVector<ExtensionSystem::PluginSpec *> | plugins() |
const QSet<ExtensionSystem::PluginSpec *> | 被插件要求的插件(ExtensionSystem::PluginSpec *spec) |
const QSet<ExtensionSystem::PluginSpec *> | 要求插件的插件(ExtensionSystem::PluginSpec *spec) |
void | 远程参数(const QString &serializedArgument, QObject *socket) |
void | 删除对象(QObject *obj) |
QString | serializedArguments() |
void | 设置安装设置(Utils::QtcSettings *settings) |
void | 设置插件 IID(const QString &iid) |
void | 设置插件路径(const Utils::FilePaths &paths) |
void | 设置设置(Utils::QtcSettings *settings) |
Utils::QtcSettings * | settings() |
void | shutdown() |
ExtensionSystem::PluginSpec * | 针对插件的规范(ExtensionSystem::IPlugin *plugin) |
详细信息
插件管理器用于以下任务
- 管理插件及其状态
- 操作一个公共对象池
插件
插件必须从IPlugin类派生,并具有IID "org.qt-project.Qt.QtCreatorPlugin"
。
插件管理器用于设置要搜索插件的文件系统目录列表,检索这些插件的当前状态信息,以及加载它们。
通常,应用程序会创建一个PluginManager实例并启动加载过程。
// 'plugins' and subdirs will be searched for plugins PluginManager::setPluginPaths(QStringList("plugins")); PluginManager::loadPlugins(); // try to load all the plugins
另外,可以直接访问插件的元数据、实例和状态。
对象池
插件(以及其他人)可以将对象添加到插件管理器中的一个公共池中。池中的对象必须从QObject派生,没有其他先决条件。可以通过getObject() 和 getObjectByName() 函数从对象池中检索对象。
每当对象池的状态发生变化时,插件管理器都会发出相应的信号。
对象池的常见用途是,插件(或应用程序)为其他插件提供扩展点,这是一个可以实现并添加到对象池中的类或接口。提供扩展点的插件会查找对象池中类或接口的实现。
// Plugin A provides a "MimeTypeHandler" extension point // in plugin B: MyMimeTypeHandler *handler = new MyMimeTypeHandler(); PluginManager::instance()->addObject(handler); // In plugin A: MimeTypeHandler *mimeHandler = PluginManager::getObject<MimeTypeHandler>();
ExtensionSystem::Invoker 类模板为可能会也可能不会由池中的对象提供的软扩展点提供了语法糖。这种方法既不需要用户插件与提供者插件链接,也不需要公共的头文件。由池中的提供者对象的可调用函数隐式提供接口。
ExtensionSystem::invoke() 函数模板封装了对于调用成功与否不进行检查的通用情况。
// In the "provide" plugin A: namespace PluginA { class SomeProvider : public QObject { Q_OBJECT public: Q_INVOKABLE QString doit(const QString &msg, int n) { { qDebug() << "I AM DOING IT " << msg; return QString::number(n); } }; } // namespace PluginA // In the "user" plugin B: int someFuntionUsingPluginA() { using namespace ExtensionSystem; QObject *target = PluginManager::getObjectByClassName("PluginA::SomeProvider"); if (target) { // Some random argument. QString msg = "REALLY."; // Plain function call, no return value. invoke<void>(target, "doit", msg, 2); // Plain function with no return value. qDebug() << "Result: " << invoke<QString>(target, "doit", msg, 21); // Record success of function call with return value. Invoker<QString> in1(target, "doit", msg, 21); qDebug() << "Success: (expected)" << in1.wasSuccessful(); // Try to invoke a non-existing function. Invoker<QString> in2(target, "doitWrong", msg, 22); qDebug() << "Success (not expected):" << in2.wasSuccessful(); } else { // We have to cope with plugin A's absence. } };
注意:传递给 invoke()
调用的参数类型是从参数本身推断的,并且必须与调用函数的参数类型完全匹配。没有转换,甚至没有整型提升适用,所以要显式调用具有 long
参数的函数,请使用 long(43)
或类似的方法。
注意:对象池操作函数是线程安全的。
成员函数文档
PluginManager::PluginManager()
创建一个插件管理器。每个应用程序应只创建一次。
[静态]
void PluginManager::addObject(QObject *obj)
将对象 obj 添加到对象池中,以便可以通过类型从中检索。
插件管理器不做任何内存管理。添加的对象必须由对这个对象负责的人手动从池中删除并删除。
发出 objectAdded()
信号。
另请参阅PluginManager::removeObject()、PluginManager::getObject() 和 PluginManager::getObjectByName()。
[静态]
QVector<QObject *> PluginManager::allObjects()
检索池中的所有对象的列表(不进行过滤)。
通常,客户端不需要调用此函数。
另请参阅PluginManager::getObject()。
[静态]
QStringList PluginManager::arguments()
在解析后剩余的参数(既不是启动参数也不是插件参数)。这通常是打开文件列表。
静态 [静态]
QStringList PluginManager::argumentsForRestart()
在自动重新启动应用程序时应使用的参数。这包括启用或禁用插件的插件管理器相关选项,但不包括其他选项,如返回自 arguments() 的参数和传递给 parseOptions() 方法的 appOptions。
静态 [静态]
void PluginManager::formatOptions(QTextStream &str, int optionIndentation, int descriptionIndentation)
使用指定的 optionIndentation 和 descriptionIndentation 格式化插件管理器的启动选项以用于命令行帮助,并将结果添加到 str 中。
静态 [静态]
void PluginManager::formatPluginOptions(QTextStream &str, int optionIndentation, int descriptionIndentation)
使用指定的 optionIndentation 和 descriptionIndentation 格式化插件规范中的插件选项以用于命令行帮助,并将结果添加到 str 中。
静态 [静态]
void PluginManager::formatPluginVersions(QTextStream &str)
为命令行帮助格式化插件规范的版本并添加到 str 中。
模板 [静态]
template <typename T> T *PluginManager::getObject()
从对象池中检索给定类型的对象。
此函数使用 qobject_cast
确定对象的类型。如果对象池中存在多个给定类型的对象,此函数将任选其一。
另请参阅addObject()。
模板 [静态]
template <typename T, typename Predicate> T *PluginManager::getObject(Predicate predicate)
从对象池中检索与 predicate 匹配的给定类型的对象。
此函数使用 qobject_cast
确定对象的类型。谓词必须是一个接受 T * 并返回 bool 的函数。如果存在多个匹配类型和谓词的对象,该函数将任意选择其一。
另请参阅addObject()。
静态 [静态]
QObject *PluginManager::getObjectByName(const QString &name)
从对象池中检索具有 name 的一个对象。
另请参阅addObject()。
静态 [静态]
Utils::QtcSettings *PluginManager::globalSettings()
返回用于有关默认禁用插件的默认设置的全局(用户无关)设置。
静态 [静态]
bool PluginManager::hasError()
如果任何插件即便已启用也存在错误,则返回 true。在 loadPlugins() 之后调用非常有用。
[静态]
ExtensionSystem::PluginManager *PluginManager::instance()
获取唯一的插件管理器实例。
[静态]
void PluginManager::loadPlugins()
尝试加载在设置插件搜索路径时找到的所有插件。可以使用插件的规范获取单个插件的错误和状态信息。
另请参阅 setPluginPaths() 和 plugins()。
[静态]
QVector<ExtensionSystem::PluginSpec *> PluginManager::loadQueue()
返回按顺序加载的插件列表。
[静态]
bool PluginManager::parseOptions(const QStringList &args, const QMap<QString, bool> &appOptions, QMap<QString, QString> *foundAppOptions, QString *errorString)
解析 args 中的命令行选项列表。插件管理器本身可能直接处理一些选项(例如 -noload <plugin>
),并将其作为插件注册到它们的插件规范中。
调用者(应用程序)可以通过包含 option string 和表示该选项是否需要参数的 bool 的 behalf appOptions 列表来注册自己,以请求数据。应用程序选项始终覆盖任何插件的选项。
将找到的应用程序选项设置为(option string,argument)配对。可以通过 arguments() 函数检索未处理的命令行选项。如果发生错误(例如,有参数要求的选项缺失参数),则 errorString 包含错误描述信息。
返回是否存在错误。
[静态]
QString PluginManager::pluginIID()
有效插件必须具有的 IID。
另请参阅 setPluginIID()。
[静态]
Utils::FilePaths PluginManager::pluginPaths()
插件管理器搜索插件的路径列表。
另请参阅 setPluginPaths()。
[静态]
const QVector<ExtensionSystem::PluginSpec *> PluginManager::plugins()
所有在插件搜索路径中找到的插件的列表。此列表在调用setPluginPaths()后立即有效。插件规范包含插件元数据和插件当前状态。如果插件的库已经成功加载,插件规范还将引用创建的插件实例。
另请参阅 setPluginPaths()。
[静态]
const QSet<ExtensionSystem::PluginSpec *> PluginManager::pluginsRequiredByPlugin(ExtensionSystem::PluginSpec *spec)
返回所有需要加载spec的插件。遍历依赖项。
[静态]
const QSet<ExtensionSystem::PluginSpec *> PluginManager::pluginsRequiringPlugin(ExtensionSystem::PluginSpec *spec)
返回所有需要加载spec的插件。遍历依赖项。
[静态]
void PluginManager::remoteArguments(const QString &serializedArgument, QObject *socket)
解析嵌入在serializedArgument中的选项,并将它们连同参数一起传递给相应的插件。
在操作完成后(例如,文档已关闭),socket用于断开对等连接,以支持-block
标志。
[静态]
void PluginManager::removeObject(QObject *obj)
发出aboutToRemoveObject()
信号并从对象池中移除对象obj。
另请参阅PluginManager::addObject()。
[静态]
QString PluginManager::serializedArguments()
序列化插件选项和参数,通过QtSingleApplication以单个字符串发送:":myplugin|-option1|-option2|:arguments|argument1|argument2",以冒号开头的键值表的形式。参数放在最后。
另请参阅 setPluginPaths()。
[静态]
void PluginManager::setInstallSettings(Utils::QtcSettings *settings)
定义全局(与用户无关)的settings以使用有关默认禁用插件的详细信息。在通过setPluginPaths()设置插件搜索路径之前需要设置。
[静态]
void PluginManager::setPluginIID(const QString &iid)
设置合法插件必须拥有的IID为iid。只有具有此IID的插件才会被加载,其他插件将无声忽略。
目前,在调用setPluginPaths()之前必须调用此函数。
另请参阅pluginIID()。
[静态]
void PluginManager::setPluginPaths(const Utils::FilePaths &paths)
设置插件路径。所有指定的路径以及它们的子目录树都将用于查找插件。
另见 pluginPaths() 和 loadPlugins()。
[静态]
void PluginManager::setSettings(Utils::QtcSettings *settings)
定义用于获取启用和禁用插件信息的用户特定 设置。需要在设置插件搜索路径之前使用 setPluginPaths() 进行设置。
另见 settings()。
[静态]
Utils::QtcSettings *PluginManager::settings()
返回用于获取启用和禁用插件信息的用户特定设置。
[静态]
void PluginManager::shutdown()
关闭并删除所有插件。
[静态]
ExtensionSystem::PluginSpec *PluginManager::specForPlugin(ExtensionSystem::IPlugin *plugin)
返回对应于 插件 的 PluginSpec。
©2024 Qt公司。本文件中包含的文档贡献者拥有相应的版权。本文件提供的内容根据自由软件基金会发布的条款在《GNU自由文档许可证》版本1.3下获得许可。Qt及其各自的标志是芬兰及/或其他国家Qt公司注册的商标。所有其他商标均属于各自所有者。