Qt中是否有等效的MFCs OnUpdate
Is there an equivalent to MFCs OnUpdate in Qt?
我有一个现有的应用程序,它使用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()此处