qt添加菜单纯代码_Qt Creator 插件开发(3):添加菜单项
本章我們將學習如何向 Qt Creator 的菜單欄添加內容。在上一章插件的基礎之上,我們將嘗試開發一個比較正式的插件——在菜單欄中可以看到,并且可以相應用戶動作等。
在我們開始之前,我們先來看看 Qt Creator 已有的菜單:
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
#include
Core::ActionManager* am = Core::ICore::instance()->actionManager();
Core::ActionContainer
ActionContianer表示 Qt Creator 中的菜單項或者菜單欄。我們從來不會直接創建ActionContainer的實例,而是通過ActionManager::createMenu()、ActionManager::createMenuBar()這樣的函數進行創建。我們會在后文對此進行詳細介紹。
Qt Creator 每一個默認菜單都關聯一個ActionContainer對象。給定一個菜單,獲取其關聯的ActionContainer對象,可以使用下面的代碼:
#include
#include
#include
#include
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
#include
#include
#include
Core::ActionManager* am = Core::ICore::instance()->actionManager();
Core::ActionContainer* ac = am->actionContainer( Core::Constants::M_HELP );
添加菜單項
下面,我們重新回到上一章中已經編寫完成的 DoNothing 插件。現在,我們希望向“Help”菜單中增加一個 “About DoNothing” 菜單項。于是,我們需要修改 DoNothingPlugin.cpp 文件如下:
#include
#include
#include
#include
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,看看我們新增的菜單項:
不過,這樣做還是有一些缺憾。雖然我們的代碼能夠正常工作,但是這并不是推薦的做法。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
#include
#include
#include
#include
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” 菜單中,但是這次出現在了開始位置。
然后再打開 “Keyboard Shortcuts” 對話框,我們已經能夠找到 “About DoNothing”:
總結
以上是生活随笔為你收集整理的qt添加菜单纯代码_Qt Creator 插件开发(3):添加菜单项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 功率谱 幅值谱_语音合成中的Mel谱和M
- 下一篇: (BFS)Catch That Cow(