替代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。