Qt设计UI的时候,依赖信号槽机制进行通信,以下图为例:
通常子对象的通信可以通过父对象来转发。上图中,QAChildWidget发送信号给父窗口QAWidget, QAWidget转发信号给父窗口QFatherWidget, QFatherWidget来通知QBChildWidget。
缺点:如果业务发生变动,例如:QAChildWidget和QAWidget之间增加了一层窗口或者QAChildWidget成为了其他模块的子窗口,这时候需要修改代码,重新找一条通信线路。
针对上述的缺点,我们作一些修改,如下图所示:
增加一个全局的QObject,让QAChildWidget和QBChildWidget之间的通信通过QObject来转发。QObject作为我们的消息转发中心,任务就是负责窗口模块之间的通信。
工作流程(附带伪代码):
1 创建全局的QObject对象, Static QObject *object =new QObject; (可参考单例模式)
2 窗口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之间的点对点通信。