forked from qt-creator/qt-creator
Signed-off-by: Abhishek Patil <abhishek.patil@vcreatelogic.com> Merge-request: 145 Reviewed-by: con <qtc-committer@nokia.com>
305 lines
10 KiB
Plaintext
305 lines
10 KiB
Plaintext
/*!
|
|
\page menu.html
|
|
\title 5. Adding menu and menu-items
|
|
|
|
In this chapter we will understand how to add entries to existing menus in Qt Creator. We will also learn how to add new
|
|
menu entries. Before moving ahead let's take a look at the menu bar in Qt Creator
|
|
|
|
\inlineimage qtc-menubar-5.png
|
|
|
|
|
|
The menu bar consists of the following set of default menus
|
|
\list
|
|
\o File
|
|
\list
|
|
\o New
|
|
\o Open
|
|
\o Recent Files
|
|
\endlist
|
|
\o Edit
|
|
\list
|
|
\o Advanced
|
|
\endlist
|
|
\o Tools
|
|
\o Window
|
|
\list
|
|
\o Panes
|
|
\endlist
|
|
\o Help
|
|
\endlist
|
|
|
|
\bold {Note:}\underline{Other menu items like Build and Debug come from plugins. They are not a part of the default menu set}.
|
|
|
|
As Qt developers we know that the above menus are shown within a \bold {QMenuBar}; and that there is a \bold {QMenu} associated
|
|
with each of the above menus.
|
|
|
|
\section1 5.1 Core::ActionManager
|
|
|
|
The main Qt Creator program is nothing but a plugin loader. All of the functionality provided by Qt Creator is provided
|
|
by the plugins. The main plugin for Qt Creator is called "core" Without core, Qt Creator really doesn't have a personality
|
|
|
|
One of the key components of the "core" is the \bold {ActionManager}.\bold {ActionManager} is responsible for registration of menus,
|
|
menu-items and keyboard shortcuts. So if we wanted to add a new menu-item or menu, we would have to use
|
|
\bold {ActionManager}. The coming subsections explain this better.
|
|
|
|
To gain access to the \bold {ActionManager}, the following piece of code can be used.
|
|
\code
|
|
#include <coreplugin/actionmanager/actionmanager.h>
|
|
#include <coreplugin/icore.h>
|
|
Core::ActionManager* am = Core::ICore::instance()->actionManager();
|
|
\endcode
|
|
|
|
\section1 5.2 Core::ActionContainer
|
|
|
|
ActionContianer represents menu or menubar in Qt Creator. Instances of ActionContainer are never created directly,
|
|
instead they are accessed using ActionManager::createMenu(), ActionManager::createMenuBar() etc; but more on that
|
|
later.
|
|
There is an ActionContainer associated with each of the default menus in Qt Creator. Fetching ActionContainer for a
|
|
given menu can be done using the following code snippet
|
|
|
|
\code
|
|
#include <coreplugin/coreconstants.h>
|
|
#include <coreplugin/actionmanager/actionmanager.h>
|
|
#include <coreplugin/icore.h>
|
|
|
|
Core::ActionManager* am = Core::ICore::instance()->actionManager();
|
|
Core::ActionContainer* ac = am->actionContainer( ID );
|
|
\endcode
|
|
The following table lists out the ID to use for each of the menus in Qt Creator. Each of the IDs are defined as \bold {const}
|
|
\bold {char*} static variables within the \bold {Core} namespace.
|
|
|
|
\table
|
|
\header
|
|
\o Menu
|
|
\o ID
|
|
\row
|
|
\o File
|
|
\o Core::Constants::M_FILE
|
|
\row
|
|
\o File->New
|
|
\o Core::Constants::M_FILE_NEW
|
|
\row
|
|
\o File->Open
|
|
\o Core::Constants::M_FILE_OPEN
|
|
\row
|
|
\o Edit
|
|
\o Core::Constants::M_FILE_RECENTFILES
|
|
\row
|
|
\o Edit->Advanced
|
|
\o Core::Constants::M_EDIT_ADVANCED
|
|
\row
|
|
\o Tools
|
|
\o Core::Constants::M_TOOLS
|
|
\row
|
|
\o Window
|
|
\o Core::Constants::M_WINDOW
|
|
\row
|
|
\o Window Panes
|
|
\o Core::Constants::M_WINDOW_PANES
|
|
\row
|
|
\o Help
|
|
\o Core::Constants::M_HELP
|
|
\endtable
|
|
|
|
So if we want to catch hold of the "Help" menu, we can use the code snippet as follows
|
|
\code
|
|
#include <coreplugin/coreconstants.h>
|
|
#include <coreplugin/actionmanager/actionmanager.h>
|
|
#include <coreplugin/icore.h>
|
|
|
|
Core::ActionManager* am = Core::ICore::instance()->actionManager();
|
|
Core::ActionContainer* ac = am->actionContainer( Core::Constants::M_HELP );
|
|
\endcode
|
|
|
|
\section1 5.3 Registering menu-items.
|
|
|
|
The Core::Command class represents an action like a menu item, tool button, or shortcut. You don't create Command
|
|
objects directly, instead use we use ActionManager::registerAction() to register an action and retrieve a Command. The
|
|
Command object represents the user visible action and its properties.
|
|
|
|
Shown below is the right way to add the "About DoNothing" menu-item from the DoNothing plugin.
|
|
|
|
\code
|
|
#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(tr("About DoNothing"),this),
|
|
"DoNothingPlugin.AboutDoNothing",
|
|
QList<int>() <<Core::Constants::C_GLOBAL_ID
|
|
);
|
|
|
|
// Add the command to Help menu
|
|
am->actionContainer(Core::Constants::M_HELP)->addAction(cmd);
|
|
return true;
|
|
}
|
|
\endcode
|
|
\bold {Warning:}\underline { ac->menu()->addAction("About DoNothing") should never be used when adding menu items to Qt Creator.}
|
|
|
|
After compiling the changes, we can notice that the "About DoNothing" action shows up in the "Help" menu; but at the
|
|
beginning.
|
|
|
|
\inlineimage qtc-helpdonothing-5.png
|
|
|
|
|
|
If the "About DoNothing" menu item is to be placed in between specified menu item the we will make a small update in the code block
|
|
\code
|
|
bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
|
|
{
|
|
.....
|
|
// Add the command to Help menu
|
|
am->actionContainer(Core::Constants::M_HELP)->addAction(showCmd, Core::Constants::G_HELP_HELP);
|
|
return true;
|
|
}
|
|
\endcode
|
|
|
|
The effect of the change in code can be seen in the image below.
|
|
|
|
\inlineimage qtc-menuitemposition-5.png
|
|
|
|
|
|
When added this way, we will be able to find the "About DoNothing" action in the "Keyboard Shortcuts" dialog box and
|
|
also associate a keyboard shortcut with it.
|
|
|
|
\inlineimage qtc-options-keyboard-5.png
|
|
|
|
|
|
\section1 5.4 Responding to menu-items
|
|
Since menu-items are QActions, we can connect to their triggered(bool) or toggled(bool) signal and respond to
|
|
trigger/toggled events. The code below shows how to do this
|
|
\code
|
|
class DoNothingPlugin : public ExtensionSystem::IPlugin
|
|
{
|
|
Q_OBJECT
|
|
|
|
private slots:
|
|
void about();
|
|
};
|
|
|
|
bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
|
|
{
|
|
......
|
|
QAction *action = new QAction(tr("About DoNothing"),this);
|
|
Core::Command* cmd = am->registerAction(action,
|
|
"DoNothingPlugin.AboutDoNothing",
|
|
QList<int>() << 0);
|
|
......
|
|
connect(action, SIGNAL(triggered(bool)), this, SLOT(about()));
|
|
return true;
|
|
}
|
|
|
|
void DoNothingPlugin::about()
|
|
{
|
|
QMessageBox::information(0, "About DoNothing Plugin",
|
|
"Seriously dude, this plugin does nothing");
|
|
}
|
|
\endcode
|
|
|
|
After compiling the changes and clicking on the "About DoNothing" menu-item, we can see the information dialog box
|
|
as shown below.
|
|
|
|
\inlineimage qtc-menuresponse-5.png
|
|
|
|
|
|
If you wanted the message box to have the Qt Creator main window as its parent, then you can use the following code
|
|
for the about() slot.
|
|
|
|
\code
|
|
void DoNothingPlugin::about()
|
|
{
|
|
QMessageBox::information(Core::ICore::instance()->mainWindow(),
|
|
"About DoNothing Plugin",
|
|
"Seriously dude, this plugin does nothing");
|
|
}
|
|
\endcode
|
|
|
|
\section1 5.5 Adding menus
|
|
The procedure for adding menus is the same. Instead of creating a \bold {Core::Command}, we create a \bold {Core::ActionContainer}
|
|
and add it to the \bold {MENU_BAR}. The following code snippet highlights the changes from our previous version.
|
|
\code
|
|
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 DoNothing menu
|
|
Core::ActionContainer* ac = am->createMenu("DoNothingPlugin.DoNothingMenu");
|
|
ac->menu()->setTitle("DoNothing");
|
|
|
|
// Create a command for "About DoNothing".
|
|
QAction *action = new QAction(tr("About DoNothing",this));
|
|
Core::Command* cmd = am->registerAction(action,"DoNothingPlugin.AboutDoNothing",QList<int>() << 0);
|
|
|
|
// Add DoNothing menu to the menubar
|
|
am->actionContainer(Core::Constants::MENU_BAR)->addMenu(ac);
|
|
|
|
// Add the "About DoNothing" action to the DoNothing menu
|
|
ac->addAction(cmd);
|
|
|
|
// Connect the action
|
|
connect(action, SIGNAL(triggered(bool)), this, SLOT(about()));
|
|
return true;
|
|
}
|
|
\endcode
|
|
After recompiling the changes, you will be able to notice the DoNothing menu as shown in the screenshot below.
|
|
|
|
\inlineimage qtc-donothingleft-5.png
|
|
|
|
\section1 5.6 Placing menus and menu-items
|
|
It is possible to insert menus and menu-items anywhere you want. Shown below is a code snippet that inserts the
|
|
"DoNothing" menu before the "Help" menu.
|
|
\code
|
|
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 DoNothing menu
|
|
Core::ActionContainer* ac = am->createMenu("DoNothingPlugin.DoNothingMenu");
|
|
ac->menu()->setTitle("DoNothing");
|
|
|
|
// Create a command for "About DoNothing".
|
|
QAction *action = new QAction(tr("About DoNothing"),this);
|
|
Core::Command* cmd = am->registerAction(action,"DoNothingPlugin.AboutDoNothing",QList<int>() << 0);
|
|
|
|
// Insert the "DoNothing" menu between "Window" and "Help".
|
|
QMenu* windowMenu = am->actionContainer(Core::Constants::M_HELP)->menu();
|
|
QMenuBar* menuBar = am->actionContainer(Core::Constants::MENU_BAR)->menuBar();
|
|
menuBar->insertMenu(windowMenu->menuAction(), ac->menu());
|
|
|
|
// Add the "About DoNothing" action to the DoNothing menu
|
|
ac->addAction(cmd);
|
|
|
|
// Connect the action
|
|
connect(action, SIGNAL(triggered(bool)), this, SLOT(about()));
|
|
return true;
|
|
}
|
|
\endcode
|
|
|
|
After compiling the changes, we can now notice that change in position of the "DoNothing" menu.
|
|
|
|
\inlineimage qtc-donothingright-5.png
|
|
|
|
|
|
You can use a similar technique for customizing the position of menu-items.
|
|
|
|
*/
|