【问题标题】:How to structure signals/slots?如何构造信号/槽?
【发布时间】:2013-09-25 20:36:14
【问题描述】:

我正在使用 Qt 创建一个 UI,其中有两个元素可能存在也可能不存在。此外,他们的父母也是不同的元素。然而,一个影响另一个。

我应该如何以最佳方式构建信号/槽(或者我什至不应该使用该模式)?

脑海中浮现的方法都像是 hack:

  • 在所有父级中创建一个信号/槽,然后向上传递然后向下传递信号
  • 在两者最近的共同父级中创建一个信号/插槽,然后让子级将其信号/插槽连接到父级的
  • 在创建一个时,导航另一个的结构以获取元素,然后直接连接信号/插槽。非常感谢这里的任何指导。

编辑:“present”表示用户可以按下一个按钮来创建一个元素并将其添加到布局中。因此,根据按钮按下的组合,一个元素可能存在或不存在。

“影响”意味着它改变了它的状态。例如,有一个项目列表和一个在其他地方添加一个元素到列表的按钮。

例如,想象一个包含待办事项列表的选项卡式窗格。选项卡式窗格中没有一个按钮,可将项目添加到列表中。选项卡式窗格不会创建窗格的所有元素。它只创建可见窗格的元素,并在窗格关闭时将其删除。因此,该列表可能存在也可能不存在。

【问题讨论】:

  • 请粘贴代码;那值千言万语。 :) 你所说的“现在”是什么意思,比如可见/禁用/等等? “影响”是什么意思?你为什么提到他们有不同的父母?另外,您要解决什么任务?能举个具体的例子吗?
  • 我添加了一些编辑来解释术语。至于为什么我提到他们有不同的父母,那是因为它使解决方案复杂化。这个问题是关于一个具体问题的,但我宁愿有一个通用的解决方案而不是一个具体的解决方案。此外,这里有代码会占用太多空间。
  • 不,请粘贴代表您问题的最短代码。
  • 我试着添加一个具体的例子。出于法律原因,我不能粘贴代码,除非我重写所有代码只是为了粘贴到这里,从自定义组件的数量可以看出这将花费太多时间。
  • @chacham15:代码会很好地解释你想要什么,而编写虚拟名称会将你的业务逻辑抽象出来。有关详细信息,请参阅 sscce.org,或者您可以使用 QtDesigner 创建屏幕截图,或者只是编写一些 qml 来表示问题。在当前状态下很难理解你的意思。我仍然很困惑为什么你不能只使用 connect(myUiElement1, SIGNAL(mysignal(...)), myUiElement2, SLOT(mySlot(...)));

标签: c++ c qt signals-slots


【解决方案1】:

UI 元素是 QWidgets。所有的 QWidgets 都是 QObjects。任何 QObject 的信号都可以连接()到任何其他对象的插槽。 父/子关系的层次完全无关紧要

您似乎将信号槽连接与事件混淆了,如果它们仍然被给定对象忽略,则实际上可以向上传递对象层次结构。

同样值得注意的是,尽管 QObjects 被破坏,但信号槽连接是安全的。当具有连接信号或插槽的对象被破坏时,连接被安全地拆除。 您唯一不能做的就是删除插槽内的发送者或接收者对象 - 请改用object->deleteLater()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2016-10-07
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    相关资源
    最近更新 更多