如何在窗口小部件具有许多子窗口小部件时处理信号

时间:2014-02-14 04:53:25

标签: qt pyqt signals-slots

我正在设计一款包含世界地图小部件的游戏;这个小部件有100多个区域小部件作为其子级。还有一个单独的信息面板小部件。当我点击一个区域时,我希望在信息面板上发送和显示该信息。到目前为止,我的想法给了我两个选择:

  1. 将100多个区域中的每个区域连接到信息面板。这对我来说似乎很难看,因为我觉得信息面板应该只知道世界地图小部件,而不是它的内部工作方式(例如儿童)。

  2. 将100多个区域中的每个区域连接到地图窗口小部件,然后获取地图 发送另一个信号,以便由游戏中的其他小部件(例如信息面板)拾取。只要拥有独立的小部件,这似乎更好,但需要2个信号而不是1个。

  3. 这些方法中的一种是否优于另一种?或者是否有我完全遗漏的另一种解决方案?

2 个答案:

答案 0 :(得分:4)

我曾经为一家制作自己的地理空间信息系统(GIS)产品的公司工作,我们也使用Qt这个确切的用例。

根据我的经验,我们会使用选项#2,因为它封装了信息面板(即视图)和世界地图(即模型)之间的细节和关系)。

将来,您的世界地图可能包含的不仅仅是可选的区域,而且信息面板可能不需要开始了解您的所有实体世界地图显示它们。所以是的,而#2会产生一些额外的信号,从封装和扩展的角度来看,它会更好。

例如,将信息面板连接到世界地图中有关所选实体而非区域的信号。当然区域 实体并且直接使用区域可以正常工作但将来可能再次使用您的世界地图有可选的建筑物标记车辆等......

connect( mapWidget, SIGNAL( selectedEntityChanged( MapEntity* ) ), 
         infoPanel, SLOT( onSelectedEntityChanged( MapEntity* ) ) );

通过这种方式,您的信息面板可以设计为一般性地显示有关实体的信息,再次从中导出区域。如果您想在地图中添加车辆并将其设置为信息面板可以显示它,那么您只需从车辆 >实体,你会很高兴。

欢迎来到StackOverflow的好问题!

答案 1 :(得分:1)

请记住,每个QObject都附带一个属性系统 - 一个通用的,类似Python的键值存储。键是字符串,值是变体。由于QWidgetQObject,您可以利用它。就其本身而言,QSignalMapper非常多余。

您也可以使用未记录但速度稍快的userData mechanism - 它使用整数键而不是字符串键。唯一键ID是通过registerUserData()获得的,其语义与QEvent::registerEventType相同。