C++接口类使用Qt的虚信号

项目中封装库的对外接口类,包括Qt的插件框架,希望接口类是一个比较干净的类,不需要继承自Object,与Qt无关系,但又需要它的子类使用Qt的信号和槽机制,则可以如下处理。

接口类:

cpp 复制代码
/* 处理请求 */ 
#pragma once 
#include "../thnetwork_global.h" 
#include"IThNetWorkStruct.h" 
#include 
namespace Network 
{ 
class LIB_EXPORT IHttpNetWorkManager 
{ 
public: 
//@brief:获取QObject对象 
virtual QObject*getObject()=0; 

/* 返回的信号 */ 
public: 
virtual void sigReplyFinish_AcquireOrderInfo(bool success,QString error, Network::ReplyOrderInfo info)=0; 
virtual void sigReplyFinish_SubmitPatientInfo(bool success, QString error)=0; 
}; 
}
/*! @brief 获取http管理器 */ extern "C" LIB_EXPORT Network::IHttpNetWorkManager*getHttpNetWorkManager();

实现类.h:

cpp 复制代码
#pragma once 
#include"interface/IThNetWork.h" 
#include"interface/IThNetWorkStruct.h" 
#include #include class QNetworkReply; 
namespace Network { 
class HttpNetWorkManager : public QObject,public IHttpNetWorkManager 
{ 
Q_OBJECT 
public: 
QObject*getObject() { return this; }; 

public: 
HttpNetWorkManager(QObject *parent=nullptr);
 ~HttpNetWorkManager(); 

signals: 
void sigReplyFinish_AcquireOrderInfo(bool success, QString error, Network::ReplyOrderInfo info) override; 
void sigReplyFinish_SubmitPatientInfo(bool success, QString error) override; 

private slots: 


private: 
}; 
}

连接代码:

cpp 复制代码
IHttpNetWorkManager*network_manager = getHttpNetWorkManager(); 

connect(network_manager->getObject(), SIGNAL(sigReplyFinish_AcquireOrderInfo(bool, QString, Network::ReplyOrderInfo)), this,SLOT(slotReplyFinish_AcquireOrderInfo(bool,QString, Network::ReplyOrderInfo)));

可以看到在虚类中声明了两个public的虚函数,子类中声明了同样的两个信号,这样可以实现信号和槽的外部连接。

需要注意的是连接的时候,需要将对象指针转换成QObject*,其次是上面使用的Qt4的连接方式SIGNAL/SLOT,如果使用Qt5的方式 &Class::function 会报错,如果要使用lambanda的方式需要再想办法了。还有一点,信号和槽的自定义类型最好一致且完整,有的地方写Network::ReplyOrderInfo有的直接写ReplyOrderInfo可能会识别不到,从而耽误不必要的时间,我个人做法是尽量写完整Network::ReplyOrderInfo,同样注册类型也是,保证后面不出错。如下面这张图方式声明:

相关推荐
wefg15 分钟前
【Linux】线程同步与互斥 - 2(线程同步/条件变量/基于阻塞/环形队列的cp模型/线程池/线程安全/读写锁)
linux·开发语言
浅碎时光8078 分钟前
Qt 窗口 (菜单 工具栏 状态栏 浮动窗口 对话框)
qt
雨落在了我的手上11 分钟前
C语言之数据结构初见篇(2):顺序表之通讯录的实现(续)
c语言·开发语言·数据结构
你这个代码我看不懂14 分钟前
JVM栈、方法区和堆内存
java·开发语言·jvm
GIS阵地18 分钟前
一场由Qt5 painter的drawRect引起的血雨腥风
开发语言·qt·gis·qgis
学编程就要猛19 分钟前
JavaEE初阶:多线程案例
java·开发语言
码不停蹄Zzz22 分钟前
对内存堆栈管理的简单理解[C语言]
c语言·开发语言
blackicexs23 分钟前
第八周第五天
数据结构·c++·算法
娇娇yyyyyy24 分钟前
QT编程(8): qt自定义菜单项
qt·microsoft
程序员学习随笔30 分钟前
ext4 原理篇(三):日志子系统 Journal 深度剖析 —— 如何保障数据一致性?
linux·c++