我正在基于blender的GHOST系统创建简单的GUI系统,我认为在这个问题上并不是很重要。 GHOST本身就有简单的事件系统。
我的事件系统应该是灵活的,允许某种MVC模式的实现,智能内存释放,应该跨平台工作,应该用c ++ 0x编写
Folowing示例显示来自GHOST的继承方法,用于处理事件。
bool Application::processEvent(GHOST_IEvent *event)
{
GHOST_IWindow *window = event->getWindow();
bool handled = true;
switch (event->getType()) {
case GHOST_kEventWheel:
{
mouseDriver->handleWheel((GHOST_TEventWheelData *) event->getData());
}
break;
case GHOST_kEventButtonDown:
{
mouseDriver->handleButtonDown((GHOST_TEventButtonData *) event->getData());
}
break;
case GHOST_kEventButtonUp:
{
mouseDriver->handleButtonUp((GHOST_TEventButtonData *) event->getData());
}
break;
case GHOST_kEventCursorMove:
{
mouseDriver->handleCursorMove((GHOST_TEventCursorData *) event->getData());
}
break;
case GHOST_kEventKeyUp:
{
keyDriver->handleKeyUp((GHOST_TEventKeyData *) event->getData());
}
break;
case GHOST_kEventKeyDown:
{
keyDriver->handleKeyDown((GHOST_TEventKeyData *) event->getData());
}
break;
}
return true;//currently not used while experimenting`
}
我写了两个类KeyDriver和MouseDriver,它们应该处理GHOST事件并通知那些对事件感兴趣的人。现在真正的问题是从驱动程序类实现进一步事件分发的最佳实践,我已经阅读了几篇文章和解决方案,事件系统如何工作,如http://accu.org/index.php/journals/464或 C++ event system design 但我不知道选择哪一个,为什么一个比其他更好。
我曾经想过像java中的Swing那样做。在哪里创建并注册监听器类以监听组件事件,并且监听器类必须从某个类继承。
为什么这种方法比使用回调函数的仿函数更糟? 您会选择哪种实施方式?为什么?
答案 0 :(得分:3)
我使用Boost.Signals2(这是您已经引用的that StackOverflow question的已接受答案)。当我三四年前第一次学习Boost库时,我开始使用它,它被证明是简单,灵活,优雅和可靠的;我没有理由寻找其他解决方案。
自从我使用Swing已经有一段时间了,所以我无法深入评论。使用Signals2,你仍然“创建”一个“监听器类”(通过定义一个信号类型;监听器是结果槽类型);并通过connect()
方法“注册”给定信号实例的监听器。
使用Signals2,每个信号都可以接受多个参数,如果需要,可以将结果返回给信号器。连接维护有很大的灵活性。