当前位置:   article > 正文

QtCreator插件开发(二)——QtCreator菜单和菜单项_qtcreator menu

qtcreator menu

一、QtCreator菜单栏简介

1、QtCreator菜单简介

QtCreator菜单栏如下:

 QtCreator默认菜单包括“文件”、“编辑”、“工具”、“窗体”、“帮助”。“构建”、“调试”、“分析”由插件提供,不是QtCreator的默认菜单。在“帮助”菜单中的“关于插件”对话框中将所有可以取消的插件取消后重启QtCreator,得到QtCreator默认菜单如下:

2、Core::ActionManager简介

 QtCreator主程序仅仅是一个插件加载器。QtCreator所提供的所有功能都是通过插件实现的。QtCreator最主要的一个插件叫做Core插件。如果没有Core插件,QtCreator将没有插件加载功能。Core插件的关键组件是ActionManager。ActionManager的作用是注册菜单、菜单项以及键盘快捷键。如果想要添加新的菜单或菜单项,就需要使用ActionManager。

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

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

3、Core::ActionContainer简介

ActionContianer表示QtCreator中的菜单或者菜单栏。通常不会直接创建ActionContainer的实例,而通过ActionManager::createMenu()、ActionManager::createMenuBar()函数进行访问。

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

  1. #include <coreplugin/coreconstants.h>
  2. #include <coreplugin/actionmanager/actionmanager.h>
  3. #include <coreplugin/actionmanager/actioncontainer.h>
  4. #include <coreplugin/icore.h>
  5. Core::ActionManager* am = Core::ICore::instance()->actionManager();
  6. Core::ActionContainer* ac = am->actionContainer(ID);

QtCreator每个菜单的ID如下:

 每个ID都是Core命名空间中的静态const char *常量,$$QT_CREATOR_ROOT/src/plugins/coreplugin/coreconstants.h文件中定义了这些常量。

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

  1. #include <coreplugin/coreconstants.h>
  2. #include <coreplugin/actionmanager/actionmanager.h>
  3. #include <coreplugin/actionmanager/actioncontainer.h>
  4. #include <coreplugin/icore.h>
  5. Core::ActionManager* am = Core::ICore::instance()->actionManager();
  6. Core::ActionContainer* ac =  am->actionContainer( Core::Constants::M_HELP );

二、添加菜单项

如果将DoNothing插件添加到“Help”菜单,增加为“About DoNothing”菜单项。

DoNothingPlugin.cpp文件修改如下:

  1. #include <coreplugin/coreconstants.h>
  2. #include <coreplugin/actionmanager/actionmanager.h>
  3. #include <coreplugin/actionmanager/actioncontainer.h>
  4. #include <coreplugin/icore.h>
  5. #include <QMenu>
  6. bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
  7. {
  8.     Q_UNUSED(args);
  9.     Q_UNUSED(errMsg);
  10.     Core::ActionManager* am = Core::ICore::instance()->actionManager();
  11.     Core::ActionContainer* ac = am->actionContainer(Core::Constants::M_HELP);
  12.     QAction* aboutDoNothing = ac->menu()->addAction(QString::fromUtf8("About DoNothing"));
  13.     return true;
  14. }

编译后启动QtCreator,菜单如下:

 

虽然可以使用上述方法添加菜单项,但并不是推荐的方式。QtCreator中的菜单项必须在Keyboard Shortcuts参数界面中列出。

通过注册菜单项,可以实现QtCreator中的菜单项在Keyboard Shortcuts参数界面中列出。

三、注册菜单项

QtCreator的所有菜单项都应该出现在键盘选择里面的“Keyboard Shortcuts” 中。

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

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

  1. #include <coreplugin/coreconstants.h>
  2. #include <coreplugin/actionmanager/actionmanager.h>
  3. #include <coreplugin/actionmanager/command.h>
  4. #include <coreplugin/icore.h>
  5. #include <QKeySequence>
  6. #include <QAction>
  7. bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
  8. {
  9.     Q_UNUSED(args);
  10.     Q_UNUSED(errMsg);
  11.     // Fetch the action manager
  12.     Core::ActionManager* am = Core::ICore::instance()->actionManager();
  13.     // Create a command for "About DoNothing".
  14.     Core::Command* cmd = am->registerAction(
  15.                 new QAction(this),
  16.                 "DoNothingPlugin.AboutDoNothing",
  17.                 Core::Context(Core::Constants::C_GLOBAL));
  18.     cmd->action()->setText(QString::fromUtf8("About DoNothing"));
  19.     // Add the command to Help menu
  20.     am->actionContainer(Core::Constants::M_HELP)->addAction(cmd);
  21.     return true;
  22. }

编译后运行,About DoNothing菜单项已经出现在Help菜单的开始位置。

 

使用注册方式添加菜单项,可以在Keyboard Shortcuts参数界面中列出About DoNothing菜单项,并可以关联快捷键。

 四、响应菜单项

DoNothing插件已经作为一个菜单项加入到QtCreator中。既然菜单项就是一个QAction,可以通过连接triggered(bool)或者toggled(bool)信号,并增加响应trigger、toggled事件的槽函数。

插件类的实现如下:

DoNothingPlugin.h文件:

  1. #ifndef DONOTHINGPLUGIN_H
  2. #define DONOTHINGPLUGIN_H
  3. #include <extensionsystem/iplugin.h>
  4. class DoNothingPlugin : public ExtensionSystem::IPlugin
  5. {
  6.     Q_OBJECT
  7. public:
  8.     DoNothingPlugin();
  9.     ~DoNothingPlugin();
  10.     void extensionsInitialized();
  11.     bool initialize(const QStringList & arguments, QString * errorString);
  12.     void shutdown();
  13. protected slots:
  14.     void doNothing();
  15. };
  16. #endif // DONOTHINGPLUGIN_H

DoNothingPlugin.cpp文件:

  1. #include "DoNothingPlugin.h"
  2. #include <QtPlugin>
  3. #include <QStringList>
  4. #include <coreplugin/coreconstants.h>
  5. #include <coreplugin/actionmanager/actionmanager.h>
  6. #include <coreplugin/actionmanager/actioncontainer.h>
  7. #include <coreplugin/icore.h>
  8. #include <QKeySequence>
  9. #include <QAction>
  10. #include <QMessageBox>
  11. DoNothingPlugin::DoNothingPlugin()
  12. {
  13.     // Do nothing
  14. }
  15. DoNothingPlugin::~DoNothingPlugin()
  16. {
  17.     // Do notning
  18. }
  19. bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
  20. {
  21.     Q_UNUSED(args);
  22.     Q_UNUSED(errMsg);
  23.     // Fetch the action manager
  24.     Core::ActionManager* am = Core::ICore::instance()->actionManager();
  25.     // Create a command for "About DoNothing".
  26.     Core::Command* cmd = am->registerAction(
  27.                 new QAction(this),
  28.                 "DoNothingPlugin.AboutDoNothing",
  29.                 Core::Context(Core::Constants::C_GLOBAL));
  30.     cmd->action()->setText(QString::fromUtf8("About DoNothing"));
  31.     // Add the command to Help menu
  32.     am->actionContainer(Core::Constants::M_HELP)->addAction(cmd);
  33.     connect(cmd->action(), SIGNAL(triggered(bool)), thisSLOT(doNothing()));
  34.     return true;
  35. }
  36. void DoNothingPlugin::extensionsInitialized()
  37. {
  38.     // Do nothing
  39. }
  40. void DoNothingPlugin::shutdown()
  41. {
  42.     // Do nothing
  43. }
  44. void DoNothingPlugin::doNothing()
  45. {
  46.     QMessageBox::information(
  47.             0,
  48.             QString::fromUtf8("About DoNothing Plugin"),
  49.             QString::fromUtf8("Seriously dude, this plugin does nothing")
  50.         );
  51. }
  52. Q_EXPORT_PLUGIN(DoNothingPlugin)

编译后运行QtCreator,点击DoNothing菜单项:

 使用Qt Creator主窗口作为弹出消息对话框的parent,代码修改如下:

  1. void DoNothingPlugin::doNothing()
  2. {
  3.     QMessageBox::information(
  4.      Core::ICore::instance()->mainWindow(),
  5.      "About DoNothing Plugin",
  6.      "Seriously dude, this plugin does nothing");
  7. }

五、添加菜单

向QtCreator添加菜单不能使用Core::Command,而是使用Core::ActionContainer,将其添加到MENU_BAR上面。代码如下:

  1. #include <QMenu>
  2. bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
  3. {
  4.     Q_UNUSED(args);
  5.     Q_UNUSED(errMsg);
  6.     // Fetch the action manager
  7.     Core::ActionManager* am = Core::ICore::instance()->actionManager();
  8.     // Create a DoNothing menu
  9.     Core::ActionContainer* ac =  am->createMenu("DoNothingPlugin.DoNothingMenu");
  10.     ac->menu()->setTitle(QString::fromUtf8("DoNothing"));
  11.     // Create a command for "About DoNothing".
  12.     Core::Command* cmd = am->registerAction(
  13.                 new QAction(this),
  14.                 "DoNothingPlugin.AboutDoNothing",
  15.                 Core::Context(Core::Constants::C_GLOBAL));
  16.     cmd->action()->setText(QString::fromUtf8("About DoNothing"));
  17.     connect(cmd->action(), SIGNAL(triggered(bool)), thisSLOT(doNothing()));
  18.     // Add DoNothing menu to the menubar
  19.     am->actionContainer(Core::Constants::MENU_BAR)->addMenu(ac);
  20.     // Add the "About DoNothing" action to the DoNothing menu
  21.     ac->addAction(cmd);
  22.     return true;
  23. }

编译运行QtCreator如下:

 六、定位菜单、菜单项位置

当前添加的菜单或者菜单项都是在第一个位置。如何修改新增菜单或菜单项的位置,将“DoNothing”菜单放到“Help”前。示例代码如下:

  1. #include <QMenuBar>
  2. bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
  3. {
  4.     Q_UNUSED(args);
  5.     Q_UNUSED(errMsg);
  6.     Core::ActionManager* am = Core::ICore::instance()->actionManager();
  7.     // Create a DoNothing menu
  8.     Core::ActionContainer* ac =  am->createMenu("DoNothingPlugin.DoNothingMenu");
  9.     ac->menu()->setTitle(QString::fromUtf8("DoNothing"));
  10.     // Create a command for "About DoNothing".
  11.     Core::Command* cmd = am->registerAction(
  12.                 new QAction(this),
  13.                 "DoNothingPlugin.AboutDoNothing",
  14.                 Core::Context(Core::Constants::C_GLOBAL));
  15.     cmd->action()->setText(QString::fromUtf8("About DoNothing"));
  16.     connect(cmd->action(), SIGNAL(triggered(bool)), thisSLOT(doNothing()));
  17.     // Insert the "DoNothing" menu between "Window" and "Help".
  18.     QMenu* helpMenu =  am->actionContainer(Core::Constants::M_HELP)->menu();
  19.     QMenuBar* menuBar =  am->actionContainer(Core::Constants::MENU_BAR)->menuBar();
  20.     menuBar->insertMenu(helpMenu->menuAction(), ac->menu());
  21.     // Add the "About DoNothing" action to the DoNothing menu
  22.     ac->addAction(cmd);
  23.     return true;
  24. }

编译运行QtCreator如下:

 可以使用相同的方法定位菜单项的位置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/154092
推荐阅读
相关标签
  

闽ICP备14008679号