Я хочу создать приложение с плагинами, которые также могут иметь плагины (о которых основное приложение не должно знать).Причина в том, что я хочу сделать общую среду разработки для некоторых проектов кода, а затем я делаю плагин для обработки изображений.Затем я хотел бы, чтобы плагин обработчика изображений имел некоторые собственные плагины фильтров, о которых основное приложение не должно знать.Это возможно?
Вот что я получил сам:
Я хотел бы создать основную IDE с некоторыми интерфейсами.
class IDocumentFactory
{
public:
virtual ~IDocumentFactory() {}
//virtual QStringList documents() const = 0;
virtual QVector<FileOpenEntries> name_filters() const = 0;
virtual QWidget* open_document( QWidget* parent,
const QStringList &filepaths,
const QString &name_filter_key) const = 0;
};
Q_DECLARE_INTERFACE(IDocumentFactory, "S-DAIDE.IDocumentFactory/1.0")
class IDeclarePlugins
{
public:
virtual ~IDeclarePlugins() {}
virtual QStringList plugins() const = 0;
virtual void load_plugings(QObject * plugins) = 0;
};
Q_DECLARE_INTERFACE(IDeclarePlugins, "S-DAIDE.IDeclarePlugins/1.0")
Теперь я хотел бы определить интерфейсв моем плагине, который могут реализовать другие плагины.
class MyPlugin : public QObject, IDeclarePlugins
{
Q_OBJECT
Q_INTERFACES(IDeclarePlugins)
...
QStringList ImagePlugin::plugins() const
{
return QStringList() << "S-DAIDE.ImagePlugin.IOverlay/1.0";
}
}
В моих плагинах загрузки основного приложения.
foreach (QString fileName, m_plugins_dir.entryList(QDir::Files)) {
QPluginLoader loader(m_plugins_dir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
}
Существует ли способ проверить, реализует ли плагин интерфейс, основанный настрока используется с Q_DECLARE_INTERFACE
.Таким образом я могу заставить плагин загружать все другие плагины, которые он объявляет virtual QStringList plugins() const = 0;