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

相关推荐
q***318314 分钟前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
合作小小程序员小小店27 分钟前
桌面安全开发,桌面二进制%恶意行为拦截查杀%系统安全开发3.0,基于c/c++语言,mfc,win32,ring3,dll,hook,inject,无数据库
c语言·开发语言·c++·安全·系统安全
合作小小程序员小小店27 分钟前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#
Codeking__30 分钟前
C++ 11 atomic 原子性操作
开发语言·c++
crescent_悦33 分钟前
PTA L1-020 帅到没朋友 C++
数据结构·c++·算法
懂得节能嘛.36 分钟前
【Java动态线程池】Redis监控+动态调参
java·开发语言·redis
ModestCoder_1 小时前
ROS Bag与导航数据集技术指南
开发语言·人工智能·自然语言处理·机器人·具身智能
卡提西亚1 小时前
C++笔记-34-map/multimap容器
开发语言·c++·笔记
2***B4491 小时前
C++在金融中的QuantLibXL
开发语言·c++·金融