【发布时间】:2011-12-10 09:12:49
【问题描述】:
我想要一个 Qt4 (PyQt4) 程序中的范例,其中组件能够在不知道信号来自何处的情况下响应信号。
我的初步阅读表明我必须明确地将信号连接到插槽。但我想要的是让许多组件中的任何一个能够发送信号,并让它被另一个组件处理。
与其他工具包相比,例如,在 wxWidgets 中,我会使用事件。这些会自动从子窗口/对象传播到父母。在每个级别都可以处理它们。这意味着如果我有很多可能发出相同事件的孩子,我不必将所有孩子都显式连接到处理程序。我可以将处理程序放在父级或窗口层次结构中的更高级别。这意味着只有事件生成器和消费者需要知道事件。消费者不需要知道事件的来源在哪里,有多少这样的来源,或者关于它的任何其他信息。
这在 Qt 中是否可行 - 还有其他方法吗?也许有信号和插槽的替代事件机制?
【问题讨论】:
-
我不确定我是否理解你的意思,但你可以将信号连接到信号(所谓的触发)。或者,也许您想将许多具有相同信号的对象连接到一个插槽,并获取有关谁是发送者的信息?
-
我在问题中添加了更多内容以试图澄清
-
如果你想让信号表现为事件,为什么不直接使用events呢?
-
嗨.. 一个非常好的问题。主要是因为我直到一天前才找到它们。我仍在尝试了解 Qt。显然这就是我需要的!我仍然有点不清楚它们是如何传播的。到目前为止我读过的文档说“一些事件从孩子传播到父母”,但我没有找到任何指定用户事件在发布到小部件或应用程序时如何传播的内容?例如,其他小部件以什么顺序查看它们.. 指向文档的指针欢迎!
-
我之前的评论不是最有帮助的,所以我会在这里尝试修改。
QApplication::notify()负责将事件传递给QObjects,这是熟悉QEvents 的良好起点。通过创建具有自定义类型的新实例并覆盖notify()来创建自定义QEvent,以便它将这些事件传播到父小部件,并且您将具有与您在 wx 示例中描述的类似(如果不准确)的行为。