在C+环境下使用MVC进行导航/查看流+;桌面应用程序 让我们假设你有一个全屏C++桌面应用程序,它包含多个屏幕,每个屏幕都有一个不同的函数,还有一个带有适当模型的VIEW控制器。例如,以下一组非常简化的屏幕: 测验:用户通过一组选择题进行导航 测验结果与统计数据 信息:向用户提供有关特定主题的信息 菜单(测验、信息、退出)

在C+环境下使用MVC进行导航/查看流+;桌面应用程序 让我们假设你有一个全屏C++桌面应用程序,它包含多个屏幕,每个屏幕都有一个不同的函数,还有一个带有适当模型的VIEW控制器。例如,以下一组非常简化的屏幕: 测验:用户通过一组选择题进行导航 测验结果与统计数据 信息:向用户提供有关特定主题的信息 菜单(测验、信息、退出),c++,model-view-controller,C++,Model View Controller,根据掌握原理信息专家的判断,每个ViewController都将最清楚何时完成以及移动到新屏幕的时间。然而,根据同样的原则,它不是决定下一个屏幕实际应该是什么的正确位置。在这个相当简单的示例中,有人可能会认为这是可以的,但在更复杂的应用程序中,它无疑会导致代码和逻辑重复,以及更高的耦合性和更低的内聚性。还有一个问题是,您必须在当前屏幕的ViewController中创建新的小部件和控制器,这会带来各种新问题,至少根据创建者的原则,这不是正确的选择。你必须引进一家工厂来缓解一些问题 因此,下一个合

根据掌握原理信息专家的判断,每个ViewController都将最清楚何时完成以及移动到新屏幕的时间。然而,根据同样的原则,它不是决定下一个屏幕实际应该是什么的正确位置。在这个相当简单的示例中,有人可能会认为这是可以的,但在更复杂的应用程序中,它无疑会导致代码和逻辑重复,以及更高的耦合性和更低的内聚性。还有一个问题是,您必须在当前屏幕的ViewController中创建新的小部件和控制器,这会带来各种新问题,至少根据创建者的原则,这不是正确的选择。你必须引进一家工厂来缓解一些问题

因此,下一个合乎逻辑的步骤是引入ApplicationController,它只负责管理视图及其控制器,包括从一个视图到下一个视图的导航流

在我看来,这仍然留下了一个悬而未决的问题:如何向应用程序控制器发出信号,表示是时候移动到另一个屏幕并将控件正确地移交给该对象了

例如,可以使用观察者模式。然而,如果你现在有一个昂贵的视图处于活动状态,并且希望在新屏幕处于活动状态时销毁该视图,该怎么办?如果当前ViewController向ApplicationController发出信号,表示下一个屏幕应该打开,则它可以管理所有内容,直到破坏当前活动屏幕为止,因为当前调用正是来自该对象,所以它无法做到这一点。除了这种方法的其他几个问题之外


所以我的问题是(很抱歉这么冗长的介绍:p):如何用MVC正确地实现从一个全屏小部件到另一个小部件的导航流,从而解决上述问题,将视图控制器和应用程序控制器的责任分开,并且在耦合和内聚方面很好地面向对象?

有时候,您在思考过程中遗漏了一个细节,甚至在没有意识到自己犯下的错误的情况下就打开了一整罐问题

在本例中,细节是您可以自然地发布异步和同步事件。如果必须确保不再处于事件发布方法的上下文中,请发布异步事件。一旦在处理程序中接收到该事件,就可以确保上下文已保留。例如,如果您愿意,您可以安全地删除该对象。当然,事件处理程序不应该位于您试图删除的同一对象的上下文中

为了完整性:在Qt中,可以为使用connect()进行的每个信号/插槽连接指定类型为Qt::QueuedConnection。如果发出信号,则在控件返回到线程的事件循环之前,不会传递该信号。通常,如果接收器在同一线程中,则使用Qt::AutoConnection在发出信号时(Qt::DirectConnection)传递信号;如果接收器在不同线程中,则返回到对该信号排队(Qt::QueuedConnection)


在wxWidgets中,您可以使用wxEvtHandler::QueueEvent(wxEvent*event)对事件进行排队,例如,该事件可通过应用程序singleton获得。

Simuly me,我没有注意到我登录了serverfault.:(很抱歉。有人能把问题转移到适当的位置吗?非常感谢。