C++ c+的事件系统+;
我在blender的GHOST系统的基础上创建了一个简单的GUI系统,我认为在这个问题上这并不是很重要。GHOST本身具有简单的事件系统 我的事件系统应该是灵活的,允许某种MVC模式的实现,智能内存释放,应该跨平台工作,应该用c++0x编写 下面的示例显示了从处理事件的GHOST继承的方法C++ c+的事件系统+;,c++,C++,我在blender的GHOST系统的基础上创建了一个简单的GUI系统,我认为在这个问题上这并不是很重要。GHOST本身具有简单的事件系统 我的事件系统应该是灵活的,允许某种MVC模式的实现,智能内存释放,应该跨平台工作,应该用c++0x编写 下面的示例显示了从处理事件的GHOST继承的方法 bool Application::processEvent(GHOST_IEvent *event) { GHOST_IWindow *window = event->getWindow();
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事件并通知那些对事件感兴趣的人。现在真正的问题是,从驱动程序类实现进一步事件分发的最佳实践是什么,我已经阅读了几篇文章和解决方案事件系统是如何工作的或,但我不知道选择哪一个以及为什么一个比另一个更好
我曾经想过像java中的Swing那样做。创建并注册侦听器类以侦听组件事件,并且侦听器类必须从某个类继承
为什么这种方法比使用回调函数的函子更糟糕?
您会选择哪种实现及其原因?我使用Boost.Signals2(这是您已经提到的公认答案)。我在三四年前第一次学习Boost库时就开始使用它,它被证明是简单、灵活、优雅和可靠的;我没有理由去寻找另一个解决方案
我已经有一段时间没有使用Swing了,所以我无法对它进行深入的评论。使用Signals2,您仍然可以“创建”一个“侦听器类”(通过定义一个信号类型;侦听器是结果插槽类型);然后通过connect()
方法将侦听器“注册”到给定的信号实例
对于信号2,每个信号可以接受多个参数,如果需要,将结果返回给信号器。连接维护有很大的灵活性。我使用Boost.Signals2(这是您已经提到的公认答案)。我在三四年前第一次学习Boost库时就开始使用它,它被证明是简单、灵活、优雅和可靠的;我没有理由去寻找另一个解决方案
我已经有一段时间没有使用Swing了,所以我无法对它进行深入的评论。使用Signals2,您仍然可以“创建”一个“侦听器类”(通过定义一个信号类型;侦听器是结果插槽类型);然后通过connect()
方法将侦听器“注册”到给定的信号实例
对于信号2,每个信号可以接受多个参数,如果需要,将结果返回给信号器。连接维护有很大的灵活性。谢谢,boost::signals2也是我找到的最好的解决方案之一。谢谢,boost::signals2也是我找到的最好的解决方案之一。