美文网首页
C++模拟QT信号槽

C++模拟QT信号槽

作者: swifterlc | 来源:发表于2019-08-22 13:41 被阅读0次

C++模拟QT信号槽


  1. 测试代码
  //创建信号
  Events<bool> event1{};

  //注册信号槽,使用Lambda
  event1 += [](bool flag) {MyLog << "slot1:" << flag; return true; };

  //信号发送
  event1(false);

  MyLog << "--------------------------------------------------------";

  //创建信号2
  auto event2 = MakeEvents<bool>();

  //注册信号槽,使用函数指针
  event2->RegisterLastObserver(Slot2);

  //信号发送
  event2->Emit(true);

  MyLog << "--------------------------------------------------------";

  //连接信号
  event1.AddLastPipeLine(event2);

  //信号发送
  event1.Emit(false);

  MyLog << "--------------------------------------------------------";
  1. 测试结果
测试结果
  1. 代码实现
template<typename ...Args>
class Events :
  protected NoCopiable
{
  using EventsWeakPtr = std::weak_ptr<Events>;
  using EventsSharedPtr = std::shared_ptr<Events>;
public:
  //true 事件放行
  using stl_func_type = std::function <bool(Args...)>;

  template<typename Fn>
  void operator+=(Fn &&func)
  {
    observers_.push_back(std::forward<Fn>(func));
  }

  template<typename Fn>
  void operator-=(Fn &&func)
  {
    observers_.push_front(std::forward<Fn>(func));
  }

  template<typename Fn>
  void RegisterLastObserver(Fn &&func)
  {
    operator +=(std::forward<Fn>(func));
  }

  template<typename Fn>
  void RegisterFirstObserver(Fn &&func)
  {
    operator -=(std::forward<Fn>(func));
  }

  void AddLastPipeLine(EventsWeakPtr e_other)
  {
    observers_.push_back([e_other](Args&&...args)
    {
      if (auto sp = e_other.lock()) {
        return (*sp)(std::forward<Args>(args)...);
      } else {
        return true;
      }
    });
  }

  void AddFirstPipeLine(EventsWeakPtr e_other)
  {
    observers_.push_front([e_other](Args&&...args)
    {
      if (auto sp = e_other.lock()) {
        return (*sp)(std::forward<Args>(args)...);
      } else {
        return true;
      }
    });
  }

  void operator+=(EventsWeakPtr e_other) { AddLastPipeLine(e_other); }
  void operator-=(EventsWeakPtr e_other) { AddFirstPipeLine(e_other); }

  void operator+=(EventsSharedPtr e_other) { AddLastPipeLine(e_other); }
  void operator-=(EventsSharedPtr e_other) { AddFirstPipeLine(e_other); }

  template<typename..._Args>
  bool operator()(_Args&&...args)
  {
    return Emit(std::forward<Args>(args)...);
  }

  template<typename..._Args>
  bool Emit(_Args&&...args)
  {
    return std::find_if(observers_.begin(), observers_.end(), [&](stl_func_type const&fn) {
      return !fn(std::forward<Args>(args)...);
    }) == observers_.end();
  }

private:
  std::list<stl_func_type> observers_;
};

template<typename ...Args>
using EventsPtr = std::shared_ptr<Events<Args...>>;

template<typename ...Args>
inline decltype(auto) MakeEvents()
{
  return std::make_shared<Events<Args...>>();
}

更多内容详见 helper/event_observer.h

相关文章

  • C++模拟QT信号槽

    C++模拟QT信号槽 测试代码 测试结果 代码实现 更多内容详见 helper/event_observer.h

  • Qt5 - 3. 自定义信号&槽

    信号&槽是 Qt 的核心特性之一,Qt 允许我们自定义信号&槽,因此我们可以在 Qt 程序中定义我们自己的信号&槽...

  • 信号与槽

    在Qt Designer中设置信号与槽 信号(signal) 槽(slot) 是Qt的核心机制,也是PyQt的核心...

  • Qt信号槽(signal and slot)机制初识

    写在前面 本文主要介绍Qt信号槽(signal and slot)机制,介绍Qt信号槽机制的含义,用途以及如何简单...

  • signal and slot

    信号与槽,是Qt的核心机制,pyqt 是python对Qt的完全封装,因此,信号与槽也是pyqt的核心机制。 通...

  • Qt信号槽

    信号和槽机制是 QT 的核心机制,所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含...

  • QT信号槽

    说明 该文只记录信号槽的简单用法,方便今后忘记如何使用时回看,避免浪费更多时间。就不赘述信号槽是啥了。 前提:创建...

  • Qt高级——Qt信号槽机制源码解析

    引自:https://blog.51cto.com/9291927/2070398 Qt高级——Qt信号槽机制源码...

  • Qt5 - 2. 信号&槽

    Qt 中一个重要的机制就是信号与槽,理解和熟练使用信号与槽对于学好 Qt 非常有必要。先上码看看: 效果图: 注意...

  • DTK教程 七 :信号与槽 [ 就是我点一下按钮,按钮做什么事情

    信号与槽是Qt的特色,dtk使用了Qt的库,自然是拥有这个特色的。与事件相比较而言,我更喜欢信号与槽,主要是信号与...

网友评论

      本文标题:C++模拟QT信号槽

      本文链接:https://www.haomeiwen.com/subject/bidnsctx.html