Уважаемые форумчане, помогите разобраться с одним вопросом
В примерах Qt и общей документации интерфейс плагина должен выглядеть примерно так..
#ifndef ECHOINTERFACE_H
#define ECHOINTERFACE_H
#include <QString>
//! [0]
class EchoInterface
{
public:
virtual ~EchoInterface() {}
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)
QT_END_NAMESPACE
//! [0]
#endif
т.е он не наследуется от QObject а делается чисто виртуальным
в тоже время в Qt Creator интерфейс плагина выглядит так
#ifndef IPLUGIN_H
#define IPLUGIN_H
#include "extensionsystem_global.h"
#include <QObject>
#include <QtPlugin>
namespace ExtensionSystem {
namespace Internal {
class IPluginPrivate;
class PluginSpecPrivate;
}
class PluginManager;
class PluginSpec;
class EXTENSIONSYSTEM_EXPORT IPlugin : public QObject
{
Q_OBJECT
public:
enum ShutdownFlag {
SynchronousShutdown,
AsynchronousShutdown
};
IPlugin();
virtual ~IPlugin();
virtual bool initialize(const QStringList &arguments, QString *errorString) = 0;
virtual void extensionsInitialized() = 0;
virtual bool delayedInitialize() { return false; }
virtual ShutdownFlag aboutToShutdown() { return SynchronousShutdown; }
virtual QObject *remoteCommand(const QStringList & /* options */,
const QString & /* workingDirectory */,
const QStringList & /* arguments */) { return 0; }
virtual QList<QObject *> createTestObjects() const;
PluginSpec *pluginSpec() const;
void addObject(QObject *obj);
void addAutoReleasedObject(QObject *obj);
void removeObject(QObject *obj);
signals:
void asynchronousShutdownFinished();
private:
Internal::IPluginPrivate *d;
friend class Internal::PluginSpecPrivate;
};
} // namespace ExtensionSystem
#endif // IPLUGIN_H
наследуется от QObject и имеет даже некую реализацию методов
да и плагины для расширения самого Qt в той или иной степени тоже являются потомками QObject
мне пока интересен момент сразу отнаследоваться от QObject сделал вот такой пример интерфейса
#ifndef PLUGIN_H
#define PLUGIN_H
#include <QObject>
class Plugin : public QObject {
Q_OBJECT
public:
virtual ~Plugin() {}
virtual QString echo() = 0;
};
#endif // PLUGIN_H
при сборке примера который грузить плагин получаю ошибку
/root/ghg/qpg/mainwindow.cpp:-1: ошибка: undefined reference to `Plugin::staticMetaObject'
Из всего этого получаю вопросы.
Возможно ли написать интерфейс плагина с прямым наследованием QObject (Qt Creator ведь как то смог), если да то тогда как должен выглядеть минимальный IPlugin.h?
Если это не возможно то тогда как должен выглядеть минимальный IPlugin.h для системы загрузки плагинов в Qt5?
Какой сакральный смысл макроса Q_DECLARE_INTERFACE из примера от Qt, что будет если его не вписать в интерфейс?
P.S в итоге я хочу понять каким должен быть минимальный интерфейс плагина, с поддержкой сигналов... чтобы при выполнении вот такого кода возвращался бы не пустой Plugin*
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *obj = loader.instance();
if (obj) {
Plugin *plugin = qobject_cast<Plugin*>(obj);
if (plugin) qDebug() << plugin;
}