我有一个使用MFC用于UI的现有应用程序,我正在尝试迁移到Qt。在大多数情况下,迁移是直接的,但我不确定如何管理启用的操作状态(菜单和工具栏项)。
在MFC中,您使用启用/禁用逻辑实现回调,并在显示项目时调用此回调。在Qt中,您只能访问setEnabled()方法。
是否存在将更新回调连接到操作的内置或标准化方法?或者我是否需要使用计时器创建我的解决方案并使用它注册操作?在我正在使用的大型应用程序中,'应该启用'逻辑可以遍布整个地方 - 即磁盘上的某些文件必须存在,主显示必须有一个选择,应用程序的ProcessManager :: isProcessing(必须是假的等等。当启用/禁用逻辑背后有很多条件时,依赖于对特定操作调用的setEnabled()似乎不切实际。
答案 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