qt多窗体间信号槽消息传递问题讨论

10 篇文章 0 订阅
2 篇文章 0 订阅

一.问题描述

有时候我们在很多窗体中传递信号来实现更新或者处理,如果窗体层级比较多,两个关联性较差的窗体之前要相互通信
就需要一层一层的传递(好比你跟你二哥是同一个祖宗,你要叫你二哥吃饭但是又不知道他住在哪里,你只能找到你爸
爸的住所然后去找你爸爸告诉他你要叫你二哥吃饭,然后你爸爸又只能联系到你爷爷,你爷爷只能联系你祖宗,你祖宗
再联系你二爷,你二爷再联系你二舅,你二舅终于联系到了你二哥说你要请他吃饭,这理解到位了吧),这样一层一层
的传递管理起来会很困难,耦合度高(这样你要叫你二哥吃饭全世界都知道了,又没叫他们吃饭,他们会不开心的)。

二.解决方案

我们先假设每个窗体只会被构造一次,然后给每个窗体唯一的单例指针,构造时将单例指针指向构造的对象,这样你只
需要在一个窗体中获取到另一个窗体的单例指针,就可以直接访问对象的公有函数,通过单例的方式简单实现两个关联
性较差的窗体之前的相互通信(还是刚刚你二哥那个问题,现在你可以确认了你二哥的住址,然后直接去他住的地方找
他就行了)。
通过这种方式我们实现了两个关联性较差的窗体之间的通信,然而,单例指针是每个类的,在获取单例指针时需要包含
该类的头文件,如果需要与多个窗体通信就需要包含多个窗体,每个窗体又需要去定义和实现单例的方法,也不太方
便,这个时候可以实现一个类统一管理,用map管理数据,key可以为objectname,value为单例指针,这样就可以将需
要通信的窗体注册到这个类,通过key可以获取到对应的对象。(还是你二哥那个问题,你要去找你二哥家的住址,然后
下次你二哥准备礼尚往来请你吃饭他又要去找你家的住址,万一你找你三哥又要找你三哥的住址,这种工具人干的活当
然是交给工具人啊,于是你们建了个家族的微信群(中介者),进群的时候将名字和住址填好,下次谁要找谁直接去微
信群找就行了)。
如果一个窗体要被实例化多次,你只需在构造的时候将objectname传进去就行了(你二哥又来了,不过现在你有两个二
哥,你妈那边的和你爸这边的二哥,两个二哥都是单独的个体,你在群里写好他们的备注就行了)。

三.伪代码

就以上面的例子:

//你的家族微信群
class FamilyWeChat
{
public:
	static void installPersonInfo(Person *p)
	{
		m_personMap.insert(p.Name, p);	
	}

	static Person* getInstance(QString name)
	{
		return m_personMap.value(name);
	}
	...
}
//二哥类
class ErGe
{
public:
	ErGe(QString name)
	{
		this->Name = name;
		FamilyWeChat::installPersonInfo(this);
	}
}

//new 爸家二哥
ErGe *e = new ErGe("爸家二哥");

//我联系爸家二哥做啥事,额,二哥挺突然的(二哥:不是叫我吃饭吗)
class Me
{
	void toDo()
	{
		FamilyWeChat::getInstance("爸家二哥")->toDo();
	}
};

运用qt元对象系统我们可以通过以下方式根据自己的情况的叫二哥做事
QMetaObject::invokeMethod(FamilyWeChat::getInstance("爸家二哥"), "toDo", ....);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值