wxWidgets - 事件表 vs 连接函数()?

11

我刚开始学习使用C++编写wxWidgets版本3.0。我注意到,wxWidgets中的事件处理是通过事件表完成的。但是有一篇教程也提到了Connect()函数——实际上它只是说:“这篇教程将使用事件表,而不是Connect()函数。”

我想知道,事件表和Connect()函数背后的哲学是什么?它们之间的区别是什么?在什么情况下使用其中一种比另一种更合适……谢谢。


一个谷歌查询之后:http://wxwidgets.blogspot.com/2007/01/in-praise-of-connect.html ;-) - Kristian Duske
1
实际上,你都不应该使用。相反,应该使用Bind / Unbind,因为它们比Connect / Disconnect更安全,因为它们会进行更多的编译时检查。 - Kristian Duske
@KristianDuske - 你知道有哪些展示如何使用Bind()的示例/教程吗?我相信作为一个新手,我自己不会弄清楚它。谢谢。 - James C
1个回答

23

首先,不要使用已被Bind()所取代的Connect()方法,因为它在各个方面都更好。

其次,处理事件的静态方法(使用事件表)和动态方法(使用Bind())都有效,您可以根据自己的喜好选择。就我个人而言,我建议使用Bind(),因为:

  1. 它更加灵活:可以将一个对象上的事件连接到任何其他对象,甚至是自由函数或(在C++11中)lambda表达式
  2. 它更加安全,可以在编译时捕获大多数常见错误,例如使用错误的事件处理程序签名。
  3. 它是“动态”的,即您可以随时连接和断开处理程序。

事件表的主要优点是:

  1. 它们稍微短一些,特别是在3.0版本之前。
  2. 它们在文档、示例、教程等方面更为常见,只是因为它们比Bind()早15年。

但是,它们使用起来比较笨拙,因为它们需要对对象进行子类化(从中派生一个新类)以处理其中的非命令事件,并且它们无法在编译时检测所有错误,从而允许您编写可以编译但在运行时崩溃的代码。


谢谢您的回答。您能指出一些好的例子/教程,展示如何使用Bind()吗?正如您所说,我注意到事件表无处不在。但作为一个新手,我怀疑我是否能在没有任何示例的情况下学会使用Bind()。 - James C
1
samples/event 包含一个简单的使用 Bind() 的示例(除了所有其他事件处理方法)。文档 也包含一些简单的示例。 - VZ.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接