Qt插件中的QObject工厂(非创建者)
QObject factory in Qt Plugin(non-creator)
我开始对我的问题感到非常紧张,我会努力描述我的需求,希望有人能理解。想象一下,我有一个生成一个可执行文件和一些插件(运行时加载的库)的项目。该可执行文件是某种守护程序/服务,它在一开始就寻找合适的插件。所以这些插件应该提供一些抽象的通信层。我看过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+=部分解决了问题:)
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 工厂方法:分配和strcpy_s的差异
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 在继承C++子项创建者开始时,是否可以不启动父创建者?
- 这个工厂类在这个C++视频中的意义何在?
- 此工厂功能有什么问题?
- 注册对对象工厂的调用会导致段错误
- 工厂设计模式优化
- 在 C++ 中返回新的构造函数(*this)工厂
- 确保在编译期间仅同时使用来自同一工厂的对象
- 在工厂或C++类中包含数据库 .h 文件
- Qt创建者:加载位于子目录中的项目文件
- 在基类中编写工厂方法
- WIC 工厂将始终在 Windows7 上为 nullptr("What's a Creel?"教程中使用)
- 抽象工厂结构的差异
- 带有singleton容器的c++工厂模式组件创建者
- Qt插件中的QObject工厂(非创建者)