• 观察者模式的使用


      最近项目涉及到一些焦点变化的处理,有些嵌套很深,做起来真心!@#¥%……&

      观察者模式主要是使用一种“注册——通知——撤销注册”的形式,Qt的事件处理有个“继承QApplication并重新实现notify()函数“的方式,这个可以获得所有的event事件,我关心的是焦点变化,需要定义一个接口,所有代码实现:

    class ICaptureHandler
    {
    public:
        //处理焦点变化事件
        virtual void HandleCaptureChanged(MSG * pMsg) = 0;
    };
    class CCapturerManager : public QObject
    {
        Q_OBJECT
    public:
        CCapturerManager(QObject *parent);
        ~CCapturerManager();
    
        static void Attach(ICaptureHandler* pObs);   //注册观察者
        static void Detach(ICaptureHandler* pObs);   //注销观察者
        static void DetachAll();               //注销所有观察者
        static void Notify(MSG* pArg = nullptr); //若状态变化,则遍历观察者,逐个通知更新
    
        static QMutex m_Mutex;
        static QSet<ICaptureHandler*> m_setObs;       //set保证目标唯一
    };
    QSet<ICaptureHandler*> CCapturerManager::m_setObs = QSet<ICaptureHandler*>();
    QMutex CCapturerManager::m_Mutex;
    CCapturerManager::CCapturerManager(QObject *parent)
        : QObject(parent)
    {
    }
    
    CCapturerManager::~CCapturerManager()
    {
    }
    
    void CCapturerManager::Attach(ICaptureHandler* pObs)
    {
        if (!pObs) 
            return;
    
        QMutexLocker locker(&m_Mutex);
        m_setObs.insert(pObs);
    }
    
    void CCapturerManager::Detach(ICaptureHandler* pObs)
    {
        if (!pObs)
            return;
    
        QMutexLocker locker(&m_Mutex);
        m_setObs.remove(pObs);
    }
    void CCapturerManager::DetachAll()
    {
        QMutexLocker locker(&m_Mutex);
        m_setObs.clear();
    }
    
    void CCapturerManager::Notify(MSG* pArg /* = NULL */)
    {
        qDebug() << "CCapturerManager::Notify " << m_setObs.count() << "
    ";
    
        QMutexLocker locker(&m_Mutex);
        QSet<ICaptureHandler*>::iterator itr = m_setObs.begin();
        for (; itr != m_setObs.end(); itr++)
        {
            (*itr)->HandleCaptureChanged(pArg);
        }
    }

    在需要用到的地方实现接口并注册。ok,就这样

  • 相关阅读:
    python 中classmethod修饰符、staticmethod和装饰器有什么区别
    zabbix4.0 监控 mysql5.7
    centos7 zabbix 自启动 设定
    生产环境 编译安装 zabbix 服务
    docker 环境 部署 centos7镜像 并配置免秘登陆
    dd 命令 磁盘写性能测试
    hdparm命令 硬盘读取速度压力测试
    zabbix 动态实时日志监控
    已经创建 且运行一段时间的docker容器 添加新的映射端口
    hive 锁表解决方案(unlock不掉的情况下)
  • 原文地址:https://www.cnblogs.com/qnkk123/p/9389299.html
Copyright © 2020-2023  润新知