动作管理器和命令

Qt Creator 在 编辑 > 首选项 > 环境 > 键盘 提供了一个中心选项页来管理动作的快捷键。插件必须通知 Qt Creator 它们提供的动作,以便它们可以出现在选项中。此外,一些动作,如 编辑 > 撤销,需要根据用户当前处于的环境(例如文本编辑器或 UI 设计组件)将动作分发给不同的插件。使用 Core::ActionManagerCore::Command 类来管理这些。

动作管理器包含了一个 Core::Command 实例的列表。每个命令代表键盘快捷键设置中的一个条目。

命令还管理着根据上下文当前命令代表哪个实际的 QAction。为此,命令有其自己的 QAction,可通过 Core::Command::action() 访问,并在将其添加到 UI(如菜单和工具按钮)时使用。此 QAction 将其 triggered()toggled() 信号委托给当前活动的 QAction

命令

Core::Command 类代表一个可以由用户在设置中设置由快捷键触发的动作,并且可以根据上下文委托给插件中的实际 QAction

命令通过其唯一的 ID 来引用。插件在通过 Core::ActionManager::registerAction() 在指定上下文中注册动作时使用 ID。该方法返回一个 Core::Command 实例,然后用于进一步配置动作。如果为同一命令(相同的 ID)注册了多个 QActions(QAction),则必须为不同的上下文注册它们。ID 还用于选项页的分组:ID 中第一个点之前的部分用作类别,命令在此类别下显示。

默认情况下,选项页除了显示 ID 外,还显示当前活动 QAction 的文本。如果这不很好,您可以使用 Core::Command::setDescription() 设置不同的显示文本。

使用命令的 Core::Command::setDefaultKeySequence() 方法设置默认键序列,如果用户未自定义它则使用。您不使用通过 Core::ActionManager::registerAction() 注册的 QAction 的快捷键,因此不要设置它。

Core::Command::action() 函数返回应用于 UI 和用户交互的操作。应将此操作添加到菜单和工具按钮中。您永远不应直接设置此 QAction 的启用或可见状态。它由动作管理器管理,并反映了某些插件中当前活动 QAction 的状态。

您在动作管理器中注册的 QAction 用于您内部的目的。使用它将您的逻辑连接到 QAction::triggered() 信号,并设置启用和可见状态。Core::Command::action() 将反映这些更改,如果您的 QAction 是活动的,由活动上下文决定。出于性能原因,默认情况下不更新动作文本、工具提示和图标。它们仅从为命令注册的第一个 QAction 复制。如果您需要动态更新这些属性,请设置相应的 Core::Command::CommandAttribute

上下文

当插件为命令注册 QAction 时,它们需要提供一个 Core::Context。通过当前上下文的有序列表来决定命令的哪些注册 QAction 是当前活动的。

上下文来自多个来源

  • 全局上下文。这是一个始终处于活动状态的上下文,具有最低优先级顺序。
  • 应用程序焦点。可以通过 Core::IContextQWidget 实例与上下文关联。从当前焦点小部件到小部件层次结构的所有上下文都添加到当前上下文。
  • 手动管理的上下文。通过 ICore::updateAdditionalContexts() 可以手动添加和删除上下文。

使用 IContext

Core::IContext 是一个单独的对象,将 Core::IContext::widget() 返回的 QWidget 与上下文 Core::IContext::context 关联。

要将小部件与上下文关联,请创建一个 Core::IContext 实例,设置其上的小部件和上下文,并将其注册到 Core::ICore::addContextObject()。只要您的 widget 处于应用程序焦点 widget 的父链中,您指定的上下文也将是活动的。

auto contextObj = new Core::IContext(this);
contextObj->setWidget(myWidget);
contextObj->setContext(myContext);
Core::ICore::addContextObject(contextObj);

IContext 实例在删除时会自动注销。如果需要手动注销 IContext 实例,请使用 Core::ICore::removeContextObject()。

Qt Creator 中的一些结构自动具有关联的上下文,例如 Core::IEditorCore::IMode

手动管理上下文

如果您希望上下文独立于应用程序焦点处于活动状态或非活动状态,可以使用 Core::ICore::updateAdditionalContexts()、Core::ICore::addAdditionalContext() 和 Core::ICore::removeAdditionalContext() 手动添加和删除上下文。如果您需要移除和添加上下文,请优先考虑使用 Core::ICore::updateAdditionalContexts(),以避免单独调用中删除和添加上下文产生的开销。

注册动作

建议在插件 ExtensionSystem::IPlugin::initialize() 方法中注册动作。这样任何依赖于您的插件的插件都可以访问这些动作。

namespace Constants {
const char ACTION_ID[] = "Example.Action";
} // Constants

bool ExamplePlugin::initialize(const QStringList &arguments, QString *errorString)
{
    // some other setup ...

    QAction *action = new QAction(tr("Example Action"), this);
    Core::Command *cmd = Core::ActionManager::registerAction(action, Constants::ACTION_ID,
                                            Core::Context(Core::Constants::C_GLOBAL));
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Alt+Meta+A")));
    connect(action, &QAction::triggered, this, [this] {
        // do something
    });

    // more setup ...

    return true;
}

此代码片段设置了一个具有ID ACTION_ID 的示例操作,该操作始终处于激活状态(由上下文 Core::Constants::C_GLOBAL 指定),并为其分配了键盘快捷键 Ctrl+Alt+Meta+A。注册给全局上下文的 QAction *action 操作由插件拥有。连接到这个 QAction 的触发信号,并通过调用此 QAction 实例上的相应方法来管理操作的状态。

摘要

©2024 Qt公司版权所有。在此包含的文档贡献是各自版权所有者的版权。提供的文档是根据自由软件基金会发布的 GNU自由文档许可证1.3版本 的条款授权的。Qt及其相关标志是芬兰及/或全球其它国家的Qt公司的商标。所有其他商标均为各自所有者的财产。