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,同样注册类型也是,保证后面不出错。如下面这张图方式声明:

相关推荐
csbysj20201 分钟前
jQuery 删除元素
开发语言
xxy-mm3 分钟前
Javascript 中的继承
开发语言·javascript·ecmascript
quikai19812 小时前
python练习第二组
开发语言·python
AI视觉网奇2 小时前
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr
开发语言·c++·算法
智者知已应修善业3 小时前
【输入两个数字,判断两数相乘是否等于各自逆序数相乘】2023-10-24
c语言·c++·经验分享·笔记·算法·1024程序员节
wjs20243 小时前
并查集快速合并
开发语言
free-elcmacom3 小时前
MATLAB与高等数学<1>一道曲面积分题的几何直观
开发语言·数学建模·matlab·高等数学
LaoZhangGong1233 小时前
深度学习uip中的“psock.c和psock.h”
c语言·开发语言
Tony Bai3 小时前
Go 安全新提案:runtime/secret 能否终结密钥残留的噩梦?
java·开发语言·jvm·安全·golang
oioihoii3 小时前
C++11到C++23语法糖万字详解
java·c++·c++23