代码之家  ›  专栏  ›  技术社区  ›  The Bearded Templar

当小部件有许多子部件时,如何处理信号

  •  2
  • The Bearded Templar  · 技术社区  · 12 年前

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

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

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

    这些方法中的一种比另一种更好吗?还是我完全错过了另一个解决方案?

    2 回复  |  直到 11 年前
        1
  •  4
  •   Matthew    12 年前

    我曾经为一家公司工作,该公司生产自己的地理空间信息系统(GIS)产品,我们也使用Qt进行了准确的用例。

    根据我的经验,我们将使用选项#2,因为它封装了信息面板(即 看法 )以及世界地图(即 模型 ).

    未来,也许你的世界地图将包含更多可选择的内容 区域 信息小组可能不想开始了解所有不同的 实体 在您的世界地图中显示它们。所以,是的,虽然#2会产生一些额外的信号,但从封装和扩展的角度来看,它会更好。

    例如,将信息面板连接到来自世界地图的信号 实体 而不是 区域 。当然 区域 实体 和使用 区域 直接可以工作,但在未来,也许你的世界地图会有选择 建筑 , 标记 , 车辆

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

    这样,您的信息面板可以被设计为一般地显示有关 实体 ,再次从中 区域 导出。如果要添加,请说 交通工具 将其绘制到地图上,以便信息面板显示它,您所要做的就是导出 交通工具 从…起 实体 你会很高兴去的。

    欢迎来到StackOverflow!

        2
  •  1
  •   Kuba hasn't forgotten Monica    12 年前

    记住每个 QObject 附带了一个属性系统-一个通用的、类似Python的键值存储。键是字符串,值是变量。自从 QWidget 是一个 QO对象 ,你可以利用它。就其本身而言 QSignalMapper 相当多余。

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