当前位置: 首页 > news >正文

网站登录界面模板下载seo网站关键词优化方法

网站登录界面模板下载,seo网站关键词优化方法,在微信上做彩票网站,百度seo 优化描述 基于QT信号槽机制实现类之间的交互调用通信#xff0c;适用于使用不同枚举作为消息交互的类型场景#xff0c;支持附带任意参数#xff0c;代码使用方式参考前一篇文章 特性 代码简洁#xff0c;不超过100行仅需包含一个头文件Communicator.h#xff0c;需要通信的…描述 基于QT信号槽机制实现类之间的交互调用通信适用于使用不同枚举作为消息交互的类型场景支持附带任意参数代码使用方式参考前一篇文章 特性 代码简洁不超过100行仅需包含一个头文件Communicator.h需要通信的业务类继承Communicator界面类继承VCommunicator或MVCommunicator消息通过枚举类型定义支持任意枚举消息添加枚举无需改动代码。枚举名称区分消息类型枚举值区分具体消息使用便捷只需注册消息和消息处理函数提供发送消息时附带any传递任意额外信息支持多线程同QT一致的信号槽触发方式如需控制信号槽触发方式需要额外补充代码 对比QT信号槽 适用于使用不同枚举作为消息类型场景支持附带任意参数使用同QT一样便捷只需注册消息和消息回调函数。且如果使用QT的信号槽进行通信不同的消息的类型则需要定义多个connect连接函数如ELoginMsg、ERunMsg多一种消息就要多一个connect Communicator.h #pragma once #include QMainWindow #include functional #include unordered_map #include anyclass MsgHandler { public:using MsgID size_t;using MsgHandleFunc std::functionvoid(std::any);using MsgHandleFuncNoPara std::functionvoid();templatetypename T, typename std::enable_if_tstd::is_enumT::value, voidvoid HandleMsg(T msg, std::any info std::any{}) {m_msgHandlers[HashID(msg)](info);} protected:templatetypename T, typename std::enable_if_tstd::is_enumT::value, voidMsgID HashID(T msg) {return std::hashstd::string()(typeid(T).name()) ^ std::hashsize_t()(static_castsize_t(msg));}templatetypename T, typename std::enable_if_tstd::is_enumT::value, voidvoid RegisterMsgHandler(T msg, MsgHandleFuncNoPara func) {m_msgHandlers.insert({ HashID(msg),[] (std::any) { func(); } });}templatetypename T, typename std::enable_if_tstd::is_enumT::value, voidvoid RegisterMsgHandler(T msg, MsgHandleFunc func) {m_msgHandlers.insert({ HashID(msg), func });}templatetypename T, typename std::enable_if_tstd::is_enumT::value, voidvoid RemoveMsgHandler(T msg) {if (auto findit m_msgHandlers.find(msg); findit ! m_msgHandlers.end()) {m_msgHandlers.erase(findit);}} protected:std::unordered_mapMsgID, MsgHandleFunc m_msgHandlers; };#define DEF_COMMUNICATOR_CLASS(CommClassName, QtClassName) \ class CommClassName : public QtClassName, public MsgHandler { \Q_OBJECT \ public: \CommClassName(QtClassName* parent nullptr) : QtClassName(parent) { \qRegisterMetaTypeMsgID(MsgID); \qRegisterMetaTypestd::any(std::any); \} \Q_SIGNAL void SendMsg(MsgID, std::any); \ public: \Q_SLOT void HandleHashMsg(MsgID msgID, std::any info std::any{}) { \if (bool findHandler m_msgHandlers.find(msgID) ! m_msgHandlers.end()) { \m_msgHandlers[msgID](info); \} \} \ public: \templatetypename Receiver \void Connect(Receiver* receiver) { \connect(this, CommClassName::SendMsg, receiver, Receiver::HandleHashMsg); \} \templatetypename Receiver \void Disconnect(Receiver* receiver) { \disconnect(this, CommClassName::SendMsg, receiver, Receiver::HandleHashMsg); \} \ protected: \templatetypename T, typename std::enable_if_tstd::is_enumT::value, void \void Emit(T msg, std::any info nullptr) { \emit SendMsg(HashID(msg), info); \} \ } DEF_COMMUNICATOR_CLASS(Communicator, QObject); DEF_COMMUNICATOR_CLASS(ViewCommunicator, QWidget); DEF_COMMUNICATOR_CLASS(MViewCommunicator, QMainWindow);namespace InterConnection { templatetypename Communicator1, typename Communicator2 void Connect(Communicator1* c1, Communicator2* c2) {c1-Connect(c2);c2-Connect(c1); }templatetypename Communicator1, typename Communicator2 void Disconnect(Communicator1* c1, Communicator2* c2) {c1-Disconnect(c2);c2-Disconnect(c1); } }补充 c17才支持anyC17之前的版本可以使用下面的any.h判断版本大于c17可以通过宏__cplusplus 201703L any.h #include typeinfo #include memory namespace std { class any {class AnyHelperBase{public:virtual const std::type_info type()const 0;virtual AnyHelperBase* clone()const 0;};templatetypename Tclass AnyHelper :public AnyHelperBase{public:T data;templatetypename ...ArgsAnyHelper(Args... args) :data(std::forwardArgs(args)...) {}AnyHelper(const AnyHelper rhs) :data(rhs.data) {}AnyHelper(const T value) :data(value) {}virtual const std::type_info type() const{return typeid(T);}virtual AnyHelper* clone() const{return new AnyHelper(*this);}};templatetypename Tfriend T any_cast(const any a); private:std::unique_ptrAnyHelperBase pdata{}; public:any() :pdata(nullptr) {}templatetypename Tany(T value) : pdata(new AnyHelperstd::decay_tT(value)) {}any(const any rhs) {if (rhs.pdata ! nullptr) {pdata.reset(rhs.pdata-clone());}}any(any rhs) {if (rhs.pdata ! nullptr) {pdata.reset(rhs.pdata-clone());}}any(any rhs) :pdata(rhs.pdata.release()) {}const std::type_info type() const{return pdata-type();}bool has_value() const {return pdata ! nullptr;}void reset() {pdata.reset();}templatetypename Tany operator(T value) {pdata.reset(new AnyHelperstd::decay_tT(value));return *this;}any operator(any rhs){pdata.reset(rhs.pdata-clone());return *this;} };templatetypename T T any_cast(const any a) {auto p dynamic_castany::AnyHelperstd::decay_tT*(a.pdata.get());if (p nullptr)throw std::runtime_error(Bad any cast!);return p-data; } }由于现在大多软件都是基于QT进行开发QT又有自己的事件循环机制所以只能进行拓展通信方式也可以自行实现事件循环但是跟QT结合起来用就不太适宜了。
http://www.w-s-a.com/news/968504/

相关文章:

  • 网站建设利弊宁波高端网站建设联系方式
  • 网站订票策划方案郑州代做网站
  • 免费的网站加速器注册公司邮箱
  • 千助网站建设网站整站程序
  • 自学建网站做网站优化访问网站出现目录
  • 济南网站建设是什么百度官网登录入口手机版
  • net快速建站西宁手机网站建设
  • 网站浏览器不兼容怎么办软件系统开发大概多少钱
  • 网站建设哪个公司最好shift wordpress
  • 公司网站建设功能介绍室内设计学习
  • 做网站策划容易遇到哪些问题沈阳公司网站制作
  • 做php网站都用框架吗网站备案当面核验拍摄照片
  • 泉州企业自助建站兰州最好的互联网公司
  • 监察部门网站建设方案网站seo技术教程
  • 个人网站制作源代码下载品牌建设部
  • 网站备案需要准备什么文创产品设计思路
  • 网站开发书籍推荐青岛城阳新闻最新消息
  • 秦皇岛网站建设服务聊城做网站的公司资讯
  • 30岁转行做网站设计丰涵网站建设
  • 山东省和住房建设厅网站首页开发商不按时交房可以退房吗
  • asp网站怎么做404页面跳转本地南通网站建设
  • 点击网站出现微信二维码的链接怎么做申请网站空间怎么做
  • 网站开发的论文题目广告设计排行榜
  • 网络营销网站 功能南京h5制作公司
  • 做网站的费用的会计分录合肥做网站推广哪家好
  • 电子商城网站开发怎么wordpress用的什么主题
  • 榆林电商网站建设网上做试卷的网站
  • 文山网站建设代理中公教育培训机构官网
  • 郑州it培训机构有哪些上海外贸网站seo
  • dw做网站的实用特效广东住房与城乡建设厅网站