Russian Qt Forum
Ноябрь 23, 2024, 05:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: интерфейс плагина в Qt5  (Прочитано 2943 раз)
Григорий
Гость
« : Июнь 03, 2015, 11:16 »

   Уважаемые форумчане, помогите разобраться с одним вопросом

В примерах 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;
        }
« Последнее редактирование: Июнь 03, 2015, 11:46 от Григорий » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июнь 03, 2015, 17:06 »

Можно, для этого плагин должен линковаться к библиотеке, к-ая реализует класс Plugin (о чем у вас ошибка и есть)
Записан
Григорий
Гость
« Ответ #2 : Июнь 03, 2015, 18:11 »

Можно, для этого плагин должен линковаться к библиотеке, к-ая реализует класс Plugin (о чем у вас ошибка и есть)

а можете набросать маленький пример пустого плагина и интерфейса(отнаследованного от QObject) для Qt5
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.