C++ Qt中是否有MFCs OnUpdate的等效项?

C++ Qt中是否有MFCs OnUpdate的等效项?,c++,qt,mfc,C++,Qt,Mfc,我有一个使用MFC作为UI的现有应用程序,我正在尝试迁移到Qt。在大多数情况下,迁移是直接进行的,但我不确定如何管理操作(菜单和工具栏项)的启用状态 在MFC中,使用启用/禁用逻辑实现回调,在显示项时调用该回调。在Qt中,您只能访问setEnabled()方法 是否有一种内置的或标准化的方式将更新回调连接到操作?或者我需要使用计时器创建解决方案并向其注册操作吗?在一个大型应用程序中,例如我正在使用的应用程序,“应该启用”逻辑可能会到处跳跃-例如,磁盘上的某些文件必须存在,主显示必须有一个选择,应

我有一个使用MFC作为UI的现有应用程序,我正在尝试迁移到Qt。在大多数情况下,迁移是直接进行的,但我不确定如何管理操作(菜单和工具栏项)的启用状态

在MFC中,使用启用/禁用逻辑实现回调,在显示项时调用该回调。在Qt中,您只能访问setEnabled()方法

是否有一种内置的或标准化的方式将更新回调连接到操作?或者我需要使用计时器创建解决方案并向其注册操作吗?在一个大型应用程序中,例如我正在使用的应用程序,“应该启用”逻辑可能会到处跳跃-例如,磁盘上的某些文件必须存在,主显示必须有一个选择,应用程序的ProcessManager::isProcessing()必须为false,等等。依赖setEnabled()似乎不太实际当启用/禁用逻辑背后有这么多条件时,在特定操作上被调用。

最“标准”的Qt方式是使用信号/插槽

在基于Qt MainWindow/MDI示例的我的MDI应用程序中,只要在显示或隐藏MDI子窗口时,将单个“updateMenus()”函数连接到发出的信号

现在,对于您的应用程序来说,这可能不够粒度。因此,您可以做的是-仍然有一个“updateNus()”方法-但将其连接到每个菜单的“aboutToShow()/aboutToHide()”信号

这样,您就可以避免逻辑杂乱无章,只在需要时才正确更新菜单(如MFC的OnCmdUI())

这是我的主窗口构造函数:

mp_mdiArea = new QMdiArea();
setCentralWidget(mp_mdiArea);
connect(mp_mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(updateMenus()));
这是我的更新()


请参阅Qt 4.8文档了解菜单->关于显示()/Hide()

此解决方案可能适用于菜单,但我希望能够在一般操作中实现它。将操作添加到菜单和工具栏并禁用该操作时,菜单和工具栏都将处于禁用状态。考虑到您的方法,并且考虑到我在工具栏中没有用于操作的aboutToShow(),似乎我必须有一个秒以下的计时器不断调用已注册的回调,并将结果传递给操作的setEnabled()。这会管用,但会很恶心。是的,我同意你不想走计时路线。对不起,我只是从菜单的角度考虑。我想如果是我,当相关项状态发生更改时,我可以对操作调用setEnabled()。如果我觉得逻辑到处都是,我可能会通过主类(mainwindow等)中的“updateStates()”方法来路由它们,但是我看不出除了在源代码之外,如何在任何地方处理原始事件。至少,您可以通过搜索对“updatestates()”的调用来找到所有这些文件。
void MainWindow::updateMenus()
{
    bool hasMdiChild = (activeMdiChild() != nullptr);
    mp_actionSave->setEnabled(hasMdiChild);
    mp_actionSaveAs->setEnabled(hasMdiChild);
    mp_actionClose->setEnabled(hasMdiChild);
}