Qt Creator 插件开发(3):添加菜单项

本章我们将学习如何向 Qt Creator 的菜单栏添加内容。在上一章插件的基础之上,我们将尝试开发一个比较正式的插件——在菜单栏中可以看到,并且可以相应用户动作等。

在我们开始之前,我们先来看看 Qt Creator 已有的菜单:

QtCreator 菜单

Qt Creator 的默认菜单(部分)是:

  • File
    • New
    • Open
    • Recent Files
  • Edit
    • Advanced
  • Tools
    • External
  • Window
    • Panes
    • Views
  • Help

注意,我们这里只是列出了 Qt Creator 默认的菜单,其它菜单,比如构建和调试,是由插件提供的,而不是 Qt Creator 的默认菜单。为查看这一点,我们可以将 Qt Creator 的“已安装的插件”对话框中所有能去掉的插件全部去掉,重启 Qt Creator 看看效果。

作为一个 Qt 开发人员,我们知道,所有菜单都是在QMenuBar类中提供的,并且有一个QMenu对象与上面各项相关联。

Core::ActionManager

实际上,Qt Creator 主程序仅仅是一个插件加载器。Qt Creator 所提供的所有功能都是通过插件实现的。QtCreator 最主要的一个插件叫做“core”。如果没有这个插件,Qt Creator 就真的什么都不是了(甚至连个插件加载器都不是了)。

“core” 的关键组件是ActionManager。ActionManager 的作用是注册菜单、菜单项以及键盘快捷键。所以,如果我们想要添加新的菜单或菜单项,我们就需要使用ActionManager。我们会在下文详细介绍这个内容。

为了访问到 ActionManager,我们可以使用下面的代码:

#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/icore.h>
Core::ActionManager* am = Core::ICore::instance()->actionManager();

Core::ActionContainer

ActionContianer表示 Qt Creator 中的菜单项或者菜单栏。我们从来不会直接创建ActionContainer的实例,而是通过ActionManager::createMenu()ActionManager::createMenuBar()这样的函数进行创建。我们会在后文对此进行详细介绍。

Qt Creator 每一个默认菜单都关联一个ActionContainer对象。给定一个菜单,获取其关联的ActionContainer对象,可以使用下面的代码:

#include <coreplugin/coreconstants.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/icore.h>

Core::ActionManager* am = Core::ICore::instance()->actionManager();
Core::ActionContainer* ac = am->actionContainer( ID );

下面表格给出了 Qt Creator 每个菜单的 ID。这些都是Core命名空间中的静态const char *常量。我们可以在 $$QT_CREATOR_ROOT/src/plugins/coreplugin/coreconstants.h 中找到这些定义。

菜单ID
FileCore::Constants::M_FILE
File -> OpenCore::Constants::M_FILE_OPEN
File -> NewCore::Constants::M_FILE_NEW
File -> Recent FilesCore::Constants::M_FILE_RECENTFILES
EditCore::Constants::M_EDIT
Edit -> AdvancedCore::Constants::M_EDIT_ADVANCED
ToolsCore::Constants::M_TOOLS
Tools -> ExternalCore::Constants::M_TOOLS_EXTERNAL
WindowCore::Constants::M_WINDOW
Window -> PanesCore::Constants::M_WINDOW_PANES
Window -> ViewsCore::Constants::M_WINDOW_VIEWS
HelpCore::Constants::M_HELP

如果我们想要访问“Help”菜单,我们可以使用如下的代码:

#include <coreplugin/coreconstants.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/icore.h>

Core::ActionManager* am = Core::ICore::instance()->actionManager();
Core::ActionContainer* ac = am->actionContainer( Core::Constants::M_HELP );

添加菜单项

下面,我们重新回到上一章中已经编写完成的 DoNothing 插件。现在,我们希望向“Help”菜单中增加一个 “About DoNothing” 菜单项。于是,我们需要修改 DoNothingPlugin.cpp 文件如下:

#include <coreplugin/coreconstants.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/icore.h>

bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
{
    Q_UNUSED(args);
    Q_UNUSED(errMsg);

    Core::ActionManager* am = Core::ICore::instance()->actionManager();
    Core::ActionContainer* ac = am->actionContainer(Core::Constants::M_HELP);

    QAction* aboutDoNothing = ac->menu()->addAction("About DoNothing");

    return true;
}

好了,这样就可以了!“About DoNothing” 此时就已经出现在 “Help” 菜单下,重新编译下我们的插件,然后启动 Qt Creator,看看我们新增的菜单项:

帮助菜单中的 DoNothing 项

不过,这样做还是有一些缺憾。虽然我们的代码能够正常工作,但是这并不是推荐的做法。Qt Creator 的所有菜单项都应该出现在选择里面的 “Keyboard Shortcuts” 中:

键盘快捷键

按照我们前面的做法,我们会失望地发现,我们的插件虽然添加了新的菜单项,但并没有在 “Keyboard Shortcuts” 列出。为了达到这一目的,我们需要向 Qt Creator 注册我们的菜单项。

注册菜单项

Core::Command类用于表示一个 action 动作,例如菜单项 menu item、工具按钮 tool button,或者是快捷键 shortcut。我们不应该直接创建Command对象,而是应该使用ActionManager::registerAction()注册一个 action,然后获取返回值,其返回值就是一个Command。这个Command对象表示用户可见的 action 及其属性。

下面代码显示了如何为我们的 DoNothing 插件注册 “About DoNothing” 菜单项:

#include <coreplugin/coreconstants.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/command.h>
#include <coreplugin/icore.h>

#include <QKeySequence>

bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
{
    Q_UNUSED(args);
    Q_UNUSED(errMsg);

    // Fetch the action manager
    Core::ActionManager* am = Core::ICore::instance()->actionManager();

    // Create a command for "About DoNothing".
    Core::Command* cmd = am->registerAction(
        new QAction(this),
        "DoNothingPlugin.AboutDoNothing",
        Core::Context(Core::Constants::C_GLOBAL));
    cmd->action()->setText("About DoNothing");

    // Add the command to Help menu
    am->actionContainer(Core::Constants::M_HELP)->addAction(cmd);

    return true;
}

编译运行之后,我们发现 “About DoNothing” 出现在 “Help” 菜单中,但是这次出现在了开始位置。

使用 ActionManager 添加 DoNothing 菜单

然后再打开 “Keyboard Shortcuts” 对话框,我们已经能够找到 “About DoNothing”:

DoNothing 在键盘快捷键窗口

2 Comments

  1. 小马 2011年12月30日
    • DevBean 2011年12月31日

Leave a Reply