浅谈Qt信号槽


    Qt设计UI的时候,依赖信号槽机制进行通信,以下图为例:

浅谈Qt信号槽

      通常子对象的通信可以通过父对象来转发。上图中,QAChildWidget发送信号给父窗口QAWidget, QAWidget转发信号给父窗口QFatherWidget, QFatherWidget来通知QBChildWidget。

      缺点:如果业务发生变动,例如:QAChildWidget和QAWidget之间增加了一层窗口或者QAChildWidget成为了其他模块的子窗口,这时候需要修改代码,重新找一条通信线路。

 

     针对上述的缺点,我们作一些修改,如下图所示: 

浅谈Qt信号槽

      增加一个全局的QObject,让QAChildWidget和QBChildWidget之间的通信通过QObject来转发。QObject作为我们的消息转发中心,任务就是负责窗口模块之间的通信。

     工作流程(附带伪代码):

     1 创建全局的QObject对象, Static  QObject *object =new QObject;  (可参考单例模式)

 

    窗口QAChildWidget信号changed()给object,object收到信号,则转发该信号。

        QAChildWidget的构造函数,如下:

        connect(this, SIGNAL(AChildChanged()),object, SIGNAL(AChildChanged());

        QAChildWidget的析构函数中, 如下

       disconnet(this, SIGNAL(AChildChanged()),object, SIGNAL(AChildChanged());

 

    3 窗口QBChildWidget负责接收object的信号。

       QBChildWidget的构造函数,如下:

       connect(object, SIGNAL(AChildChanged()),this, SLOT(update());

       QBChildWidget的析构函数中, 如下:

       disconnet(object, SIGNAL(AChildChanged()),this, SLOT(update());

     优点:如果发生QFatherWidget删除、QAChildWidget或者QBChildWidget移动到其他的模块等情况,代码不需要作修改,因为通过全局的消息中心作为中介者转发,可以看作是QAChildWidget和QBChildWidget之间的点对点通信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值