2010-07-20 50 views
3

我想要一个Qt4(PyQt4)程序中的一个范例,其中一个组件能够响应信号而不知道它来自哪里。如何在Qt4中广播信号

我的初始阅读表明我必须明确地将信号连接到插槽。但是我想要的是任何一个组件都能够发送一个信号,并让它由另一个组件处理。

与其他工具包比较,例如,在wxWidgets中我会使用事件。这些自动从子窗口/对象传播给父母。在每个级别都可以处理。这意味着如果我有很多可能发出相同事件的孩子,我不必将他们全部连接到处理程序。我可以将处理程序放在父窗口或窗口层次结构中的某个更高级别。这意味着只有事件发生器和消费者需要了解事件。消费者不需要知道事件的来源,有多少这样的来源,或者其他任何事情。

这是可能的Qt - 有没有另一种方法?也许有信号和插槽的替代事件机制?

+0

我不确定我是否了解你,但你可以将信号连接到信号(所谓的触发)。或者,也许你想要将很多具有相同信号的对象连接到一个插槽,并获得关于谁是发件人的信息? – 2010-07-20 10:07:34

+0

我已经添加了一些更多的问题来澄清 – 2010-07-20 19:10:28

+0

如果你想要信号作为事件行事,为什么不使用[events](http://doc.trolltech.com/4.6/eventsandfilters.html)呢? – 2010-07-23 20:02:07

回答

1

这不是一件容易的事 - 你必须知道信号对象和接收对象来连接两者。然而,取决于你需要什么,你可能能够建立一个介于两者之间的类(所以带有信号的对象告诉它们存在的类,并且有这样的信号,而带有插槽的对象告诉类它们存在并且具有连接到给定信号的这样一个插槽,并且中介类跟踪这两者,必要时进行连接)。

+0

是的..我想我可以创建一个单独的服务器类作为连接信号发生器和插槽使用者的“邮箱”。也许这是Qt中此场景的正确设计模式? – 2010-07-20 19:10:57

+0

单身人员的问题在于它在应用程序范围内。我可能只想响应由对话框的子项或其他容器生成的信号,但不响应应用程序中其他位置的类似对象。如果我尝试在对话框中应用这种方法,那么无论是信号发生器都需要知道谁对他们的信号感兴趣,或者消费者需要知道何时创建新的信号发生器,以便他们可以连接到它们。其中之一打破了组件模块化:-( – 2010-07-20 19:38:36

0

难道你只是想要一个很好的老式方法调用?响应只是该方法的返回值。

+0

不,我正在寻找更像是一个广播事件。我得到的印象是Qt支持面向对象的范式,但不是真正的事件驱动范例 信号和时隙允许比方法调用更宽松的耦合 - 信令对象和时隙接收器不需要彼此了解,但某个对象需要了解它们两者,才能连接它们。 – 2010-07-22 02:54:55

+0

我正在寻找的东西更宽松 - 没有任何东西连接事件发生器和消费者,生成器创建一个事件,消费者监听事件,消费者可以发出信号表明它处理了事件。根据它们在应用程序窗口树中的位置(即父/子窗口)定义的顺序。我认为Qt不会做这样的事情吗? – 2010-07-22 02:55:25

+0

我会说python使函数调用相当宽松,但我认为你的意思是发电机和消费者的自动关联。在这种情况下,关联基于父母/子女关系。 另一个想法:在构建时,让生成器对象(孩子)通过小部件层次结构向上查找消费者。在生成器中存储ref的消费者,并随意调用其方法。 – goertzenator 2010-07-27 19:48:33

0

信号处理程序不知道发射器(只有信号类型),发射器不知道处理器连接了什么。许多处理程序可以连接到相同的信号,并按连接顺序执行。信号可以从很多地方发出。