在Qt中是否有MFCs OnUpdate?

时间:2014-10-22 16:42:05

标签: c++ qt mfc

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

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

是否存在将更新回调连接到操作的内置或标准化方法?或者我是否需要使用计时器创建我的解决方案并使用它注册操作?在我正在使用的大型应用程序中,'应该启用'逻辑可以遍布整个地方 - 即磁盘上的某些文件必须存在,主显示必须有一个选择,应用程序的ProcessManager :: isProcessing(必须是假的等等。当启用/禁用逻辑背后有很多条件时,依赖于对特定操作调用的setEnabled()似乎不切实际。

1 个答案:

答案 0 :(得分:1)

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

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

现在,您的应用程序的粒度可能不够。所以你可以做的是 - 仍然有一个“updateMenus()”方法 - 但将它连接到每个菜单的“aboutToShow()/ aboutToHide()”信号。

这样你就可以防止逻辑遍布整个地方,只在需要时才更新菜单(比如在MFC的OnCmdUI()中)。

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

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

这是我的updateMenus():

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

请参阅Qt 4.8 doc for menu-> aboutToShow()/ Hide()here