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

相关推荐
爱吃生蚝的于勒37 分钟前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
杜杜的man4 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布5 小时前
Java中Properties的使用详解
java·开发语言·后端
versatile_zpc5 小时前
C++初阶:类和对象(上)
开发语言·c++
尘浮生5 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
小鱼仙官5 小时前
MFC IDC_STATIC控件嵌入一个DIALOG界面
c++·mfc