簡體   English   中英

Qt插件中的QObject工廠(非創建者)

[英]QObject factory in Qt Plugin(non-creator)

我開始對我的問題非常緊張,我會盡力滿足我的需要,希望有人理解。 想象一下,我有一個項目,它生成一個可執行文件和一些插件(運行時加載庫)。 該可執行文件是某種守護進程/服務,它在開始時尋找合適的插件。 所以這些插件應該提供一些抽象的通信層。 我查看了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)< - 只是插件加載和一些邏輯

./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

./Plugins/Dummy/DummyPluginInterface.h

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

./Plugins/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)

./Plugins/Dummy/DummyProtocolInterface.h

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

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

./Plugins/Dummy/DummyProtocolInterface.cpp

#include "DummyProtocolInterface.h"

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

void DummyProtocolInterface::start() {
}

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

./Plugins/Dummy/Dummy.pro

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

我的問題是,我正在獲取鏈接錯誤或運行時未解析的符號(主要是來自QObject的一些思考)或我的信號不能通過連接... ProtocolHandler應該是連接信號/插槽的那個..

誰能告訴我如何使這種方法正確? Qt的例子不包括這樣的想法..

謝謝!

亞當

所以將ProtocolInterface.h添加到HEADERS + = Plugin.pro文件的部分解決了問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM