Qt 中是不是有与 MFC OnUpdate 等效的功能?

Posted

技术标签:

【中文标题】Qt 中是不是有与 MFC OnUpdate 等效的功能?【英文标题】:Is there an equivalent to MFCs OnUpdate in Qt?Qt 中是否有与 MFC OnUpdate 等效的功能? 【发布时间】:2014-10-22 16:42:05 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

在基于 Qt MainWindow/MDI 示例的 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 文档以获得菜单->aboutToShow()/Hide() here

【讨论】:

这个解决方案可能适用于菜单,但我希望能够为一般操作实现它。当您向菜单和工具栏添加操作并禁用该操作时,菜单和工具栏都遵循禁用状态。考虑到您的方法,并且考虑到我没有用于工具栏中的操作的 aboutToShow(),看来我必须有一个亚秒级计时器不断调用注册的回调并将结果传递给操作上的 setEnabled()。这会起作用,但它会很恶心。 是的,我同意你不想走计时器路线。对不起,我只考虑菜单。我想如果是我,当相关项目状态发生变化时,我可以在操作上调用 setEnabled() 。如果我觉得逻辑到处都是,我可能会通过主类(主窗口等)中的“updateStates()”方法将它们路由,但我看不出如何在任何地方处理原始事件,但在来源。至少你总能通过搜索“updatStates()”的调用找到所有这些。

以上是关于Qt 中是不是有与 MFC OnUpdate 等效的功能?的主要内容,如果未能解决你的问题,请参考以下文章

插件中是不是有与 Bootstrap 类等效的类

react-native 中是不是有与 RCTJavaScriptDidLoadNotification 事件等效的 Android?

css中是不是有与背景图像等效的前景?

PySpark 中是不是有与 Pandas 聚合函数 any() 等效的函数?

Blazor 中是不是有与 Html.Raw 等效的内容?

C++ 中是不是有与 python 中的 astype() 函数等效的函数?