Qt插件中的QObject工厂(非创建者)

QObject factory in Qt Plugin(non-creator)

本文关键字:创建者 工厂 QObject 插件 Qt      更新时间:2023-10-16

我开始对我的问题感到非常紧张,我会努力描述我的需求,希望有人能理解。想象一下,我有一个生成一个可执行文件和一些插件(运行时加载的库)的项目。该可执行文件是某种守护程序/服务,它在一开始就寻找合适的插件。所以这些插件应该提供一些抽象的通信层。我看过Qt文档,发现QPluginLoader类应该提供从.so加载的接口,但接口不能有信号/插槽,必须是纯虚拟的。所以我在想一个可以返回基于QObject的对象的东西。。。

请不要害怕,它只有2个接口和2个实现:)

我的项目布局和内容:

/守护程序/接口/插件接口.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")

/守护程序/接口/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();
};

/精灵/ProtocolHander.cpp(&h)<-只是插件加载和一些逻辑

/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

/Plugin/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)

/插件/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的东西),或者我的信号无法连接。。。ProtocolHandler应该是连接信号/插槽的人。。

有人能告诉我如何使这种方法正确吗?Qt的例子没有涵盖这种想法。。

谢谢!

Adam

因此,将ProtocolInterface.h添加到Plugin.pro文件的HEADERS+=部分解决了问题:)