Фабрика QObject в Qt Plugin (не создатель) - PullRequest
0 голосов
/ 31 января 2012

Я начинаю очень нервничать из-за своей проблемы, я попытаюсь описать мою нужду, надеюсь, что кто-то поймет.Представьте, что у меня есть проект, который генерирует один исполняемый файл и несколько плагинов (библиотека времени загрузки).Этот исполняемый файл является своего рода демоном / сервисом, который с самого начала ищет подходящие плагины.Таким образом, эти плагины должны обеспечивать некоторый абстрактный коммуникационный уровень.Я посмотрел на Qt Doc и нашел класс QPluginLoader, который должен обеспечивать загрузку интерфейса из .so, но интерфейс не может иметь сигнал / слот, должен быть чисто виртуальным.Так что я думал о чем-то, что будет возвращать объекты на основе QObject ...

!!!Пожалуйста, не пугайтесь, его всего 2 интерфейса и 2 реализации:)

Макет и содержание моего проекта:

. / Daemon / Interfaces / PluginInterface.h

#include <QObject>
#include "PluginInterface.h"
class PluginInterface {
public:
    virtual ~PluginInterface() = 0;
    virtual ProtocolInterface* getInterface() = 0;
    virtual int getPluginId() const = 0;
};

Q_DECLARE_INTERFACE( PluginInterface, "com.porta.protocol.PluginInterface/1.0")

./Daemon/Interfaces/ProtocolInterface.h

#include <QObject>
#include "turnstile.h"
class ProtocolInterface : public QObject {
    Q_OBJECT
public:
    ProtocolInterface( QObject *parent = 0 ) : QObject( parent ) {}
    virtual QWidget* getConfigureGUI() = 0;
    virtual void init() = 0;
    virtual void start() = 0;
signals:
    void someSignal();
};

. / Daemon / ProtocolHander.cpp (& h) <- просто загрузка плагина и некоторая логика </p>

. / Daemon.pro

QT       += core gui
TARGET = porta_daemon
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app

SOURCES += main.cpp \
protocolhandler.cpp

HEADERS += protocolhandler.h \
Interfaces/protocolinterface.h \
Interfaces/protocolloader.h \
    Interfaces/turnstile.h

. / Плагины / Dummy / DummyPluginInterface.h

#include "protocolloader.h"
#include <QObject>
class DummyPluginInterface : public QObject, PluginInterface {
    Q_OBJECT
    Q_INTERFACES(PluginInterface)
public:
    ProtocolInterface* getInterface();
    int getPluginId() const;
};

. / Плагины / Dummy / DummyPluginInterface.cpp

#include "DummyPluginInterface.h"
#include "DummyProtocolInterface.h"

ProtocolInterface *DummyPluginInterface::getInterface() {
    return new DummyProtocolInterface();
}

int DummyPluginInterface::getPluginId() const {
    return 1;
}

Q_EXPORT_PLUGIN2(dummyplugin, DummyPluginInterface)

. / Плагины / Dummy / DummyProtocolInterface.h

#include "protocolinterface.h"
#include <QObject>

class DummyProtocolInterface : public ProtocolInterface {
public:
    void init();
    QWidget* getConfigureGUI();
    void start();
    int getPluginId() { return 1; }
};

. / Плагины / Dummy / DummyProtocolInterface.cpp

#include "DummyProtocolInterface.h"

QWidget* DummyProtocolInterface::getConfigureGUI() {
    return 0;
}

void DummyProtocolInterface::start() {
}

void DummyProtocolInterface::init() {
    emit someSignal(); /// !!! this is important for me
}

. / Плагины / Dummy / Dummy.pro

TEMPLATE        = lib
CONFIG         += plugin
QT             += network
INCLUDEPATH += ../../Daemon/Interfaces/
HEADERS        += ****
SOURCES        += ****
TARGET          = *****
DESTDIR         = *****

Моя проблема заключается в том, чтоЯ получаю ошибки связывания или неразрешенные символы во время выполнения (в основном, некоторые из QObject) или мои сигналы не могут быть подключены ... ПротоколHandler должен быть тем, кто соединяет сигналы / слоты ..

Может кто-нибудь сказать мне, как сделатьэтот подход правильно?Примеры Qt не охватывают такие мысли ..

СПАСИБО!

Адам

1 Ответ

2 голосов
/ 01 февраля 2012

То есть добавление ProtocolInterface.h в заголовки + = раздел файла Plugin.pro

...