Я начинаю очень нервничать из-за своей проблемы, я попытаюсь описать мою нужду, надеюсь, что кто-то поймет.Представьте, что у меня есть проект, который генерирует один исполняемый файл и несколько плагинов (библиотека времени загрузки).Этот исполняемый файл является своего рода демоном / сервисом, который с самого начала ищет подходящие плагины.Таким образом, эти плагины должны обеспечивать некоторый абстрактный коммуникационный уровень.Я посмотрел на 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 не охватывают такие мысли ..
СПАСИБО!
Адам