Qt中是否有等效的MFCs OnUpdate

Is there an equivalent to MFCs OnUpdate in Qt?

本文关键字:MFCs OnUpdate 是否 Qt      更新时间:2023-10-16

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

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

有没有内置或标准化的方法将更新回调连接到操作?还是我需要使用计时器创建解决方案并向其注册操作?在一个大型应用程序中,比如我正在处理的应用程序,"应该启用"逻辑可以跳到所有地方,即磁盘上的某些文件必须存在,主显示器必须有一个选择,应用程序的ProcessManager::isProcessing()必须为false,等等。当启用/禁用逻辑后面有很多条件时,依赖于在特定操作上调用setEnabled()似乎并不实用。

最"标准"的Qt方式是使用信号/插槽。

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

现在,对于您的应用程序来说,这可能不够粒度。所以你可以做的是——仍然有一个"updateMenus()"方法——但将它连接到每个菜单的"aboutToShow()/abouttToHide()"信号。

这样可以防止逻辑到处乱放,并且只在需要时更新菜单(如MFC的OnCmdUI())。

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

mp_mdiArea = new QMdiArea();
setCentralWidget(mp_mdiArea);
connect(mp_mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(updateMenus()));

这是我的更新菜单():

void MainWindow::updateMenus()
{
    bool hasMdiChild = (activeMdiChild() != nullptr);
    mp_actionSave->setEnabled(hasMdiChild);
    mp_actionSaveAs->setEnabled(hasMdiChild);
    mp_actionClose->setEnabled(hasMdiChild);
}

请参阅Qt 4.8文档中的菜单->aboutToShow()/Hide()此处