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

替代Qt中信号与槽的完整例子。

本来这篇文章不想写,但在Qt设计中刚好遇到这个例子,下面说一下事情的由来,

我在用QTextEdit中,想做一个格式刷,Word一样的格式刷。

例如:

当格式刷按下时,用鼠标选择文字就会自动设置一样的格式,但现在我想在两个窗体也能实现

这个功能,例如:

刚开始我以为简单用共享,把变量设为static就行,

后来发觉没那么简单,因为设置格式在鼠标事件中用按钮标记来设置的:

因此决定用Qt中的信号与槽来设计,但是发觉Q_OBJECT不能用了,之前正确编译是:

放了Q_OBJECT变成:

可能是Qt在VS配置问题,但无论如何我也查不出什么原因,可恨的是,同在一个项目中的另一个类没问题:

因此迫不得已自己设计回调函数。

注意,要用static 

static _Callback<pf_copyFormat>    m_copyFormatCallback;

可以在构造函数中注册你的回调函数,有两种方式:

(1)用类似于Qt的槽函数,但是这种要用std::bind

(2) 用lambda表达式,这种最方便

这些上篇都已介绍过:

关于如何设计等价于Qt的信号与槽机制

其中代码_callback.h没变

/************************************************************************
文件名			:  _callback.h

作者				: 李锋

功能				: 回调函数列表

手机				: 13828778863

Email			:  ruizhilf@139.com

创建时间			: 2025年03月16日

最后一次修改时间	:  2025年03月16日

***************************************************************************/
#pragma once

///
#include "_dateTime.h"
#include "_list.h"

_LF_BEGIN_


template<class T>
class _Callback_Item {
public:

    /// <summary>
    /// 只判断ID是否相等
    /// </summary>
    /// <param name="l"></param>
    /// <param name="r"></param>
    /// <returns></returns>
    friend bool  operator==(const _Callback_Item& l, const _Callback_Item& r) {
        return l.m_id == r.m_id;
    }


    friend bool  operator != (const _Callback_Item& l, const _Callback_Item& r) {
        return l.m_id != r.m_id;
    }

    friend bool  operator > (const _Callback_Item& l, const _Callback_Item& r) {
        return l.m_id > r.m_id;
    }

    friend bool  operator < (const _Callback_Item& l, const _Callback_Item& r) {
        return l.m_id  < r.m_id;
    }


    _Callback_Item(const T& pf = 0) {
        m_pf = pf;
        m_id = _DateTime::g_timeStamp();
        ++m_count;
    }

    _Callback_Item(const __int64& id) {
        m_id = id;
        m_pf = 0;
    }

    _Callback_Item(const _Callback_Item<T>& r) {
        m_pf = r.m_pf;
        m_id = r.m_id;
    }

    ~_Callback_Item() {--m_count; }

public:
    __int64 m_id;
    T m_pf;
    static size_t m_count;
};


template<class T>
size_t _Callback_Item<T>::m_count = 0;


template<class T>
class _Callback {
public:

    __int64 push_back(const _Callback_Item<T>& f) {
        m_list.push_back(f);
        return f.m_id;
    }

    void remove(const __int64& item_id) { 
        m_list.remove(item_id);
    }

    template<class... Args>
    void callback(Args... args)
    {
        for (_Callback_Item<T>& item : m_list) {
            if(item.m_pf != 0)
                item.m_pf(args...);
        }
    }
private:
    _list<_Callback_Item<T>> m_list;
};


_LF_END_

当用上回调函数时效果如下,按下一个窗体的m_format_Button,别一个自动设置checked

至于对std::bind不熟悉的朋友,自己查一下资料,问一下Deepseek。

相关文章:

  • CVPR2025 | TAPT:用于视觉语言模型鲁棒推理的测试时对抗提示调整
  • 如何实现一个DNS
  • Java Web应用程序实现用户登录、学生信息管理和验证码验证以及页面跳转等基本功能(IDEA)含(Ajax、JSTL)
  • 【时时三省】(C语言基础)用gutchar函数输入一个字符
  • Session 、Cookies 和 Token关系于区别
  • k8s中的service解析
  • SAP HTTP接口获取文件应用
  • 医院人事科室病区管理系统基于Spring Boot-SSM
  • 点击劫持详细透析
  • 3D点云数据处理中的聚类算法总结
  • 【视频】H.264的码率和图像质量
  • docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型
  • 【UE5 PuerTS笔记】PuerTS安装
  • GetX 路由管理详解
  • 【USTC 计算机网络】第二章:应用层 - DNS
  • WebSocket 中的条件竞争漏洞 -- UTCTF Chat
  • 掌握XXL-JOB:快速搭建高效任务调度系统
  • 【Linux】基于阻塞队列和循环队列的生产者消费者模型
  • 深入理解 TypeScript 中的迭代器(Iterators)与生成器(Generators)
  • 使用Java爬虫根据关键词获取Shopee商品列表?
  • 2024年境内酒店住宿行业指标同比下滑:酒店行业传统增长模式面临挑战
  • 礼来一季度净利增近三成,明星GLP-1药物替尔泊肽贡献近半收入
  • 保险经纪公司元保在纳斯达克挂牌上市,去年净赚4.36亿元
  • 前行中的“模速空间”:要攻克核心技术,也要成为年轻人创业首选地
  • 200枚篆刻聚焦北京中轴线,“印记”申遗往事
  • 青海西宁市城西区副区长于媛媛主动投案,接受审查调查