| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | /************************************************************************** | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** Copyright (c) 2012 Digia Plc and/or its subsidiary(-ies). | 
					
						
							|  |  |  | ** Contact: http://www.qt-project.org/legal | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | ** This file is part of Qt Creator | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | ** | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Free Documentation License | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU Free | 
					
						
							|  |  |  | ** Documentation License version 1.3 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation and appearing in the file included in the packaging of this | 
					
						
							|  |  |  | ** file. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-10-02 09:12:39 +02:00
										 |  |  | **************************************************************************/ | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*! | 
					
						
							|  |  |  |     \page first-plugin.html | 
					
						
							|  |  |  |     \title Creating Your First Plugin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This section describes how to create a \QC plugin by using the plugin | 
					
						
							|  |  |  |     template provided by \QC, and get the first impression of what | 
					
						
							|  |  |  |     a plugin consists of and what its general structure is. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 Creating a Plugin Project | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \QC comes with a wizard for \QC plugins, that creates a | 
					
						
							|  |  |  |     runable, \e minimal plugin for you. We strongly suggest that you | 
					
						
							|  |  |  |     use two different \QC instances for developing and testing | 
					
						
							|  |  |  |     your plugin with. Otherwise your plugin will also be loaded in your | 
					
						
							|  |  |  |     development environment, which can make that unstable while your | 
					
						
							|  |  |  |     plugin is still unstable. You can just create a copy of your \QC | 
					
						
							|  |  |  |     build and use one for actually developing, and the other for testing | 
					
						
							|  |  |  |     your plugin with. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \list 1 | 
					
						
							| 
									
										
										
										
											2012-09-03 17:50:37 +02:00
										 |  |  |         \o Select \gui{File > New File or Project > Libraries > Qt Creator Plugin > Choose}. | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |            \image firstplugin-wizard.png "Choose the \QC Plugin Wizard" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            The \gui{Introduction and Project Location} dialog opens. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            \image firstplugin-nameandpath.png "Choose Name and Place of the Project" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         \o Give your project a name and specify in which path | 
					
						
							|  |  |  |            this project will be created. The actual plugin's name can be different | 
					
						
							|  |  |  |            from the project name. You will choose that name later in the wizard. | 
					
						
							|  |  |  |            Continue to the next page. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 17:50:37 +02:00
										 |  |  |            The \gui{Kit Selection} dialog opens. | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 17:50:37 +02:00
										 |  |  |            \image firstplugin-kitselection.png "Choose the kit to build and run your project with" | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 17:50:37 +02:00
										 |  |  |         \o Select the \l{glossary-buildandrun-kit}{kit} to build and run your project with. | 
					
						
							|  |  |  |            For a \QC plugin this needs to be a kit with \gui{Desktop} device type, | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  |            and a Qt version that is compatible with the Qt version that your | 
					
						
							|  |  |  |            \QC was built with (in the best case the exact same build). | 
					
						
							|  |  |  |            If you use an incompatible Qt version to build your plugin, you | 
					
						
							|  |  |  |            will get errors while \QC tries to load your plugin. | 
					
						
							|  |  |  |            Continue to the next page. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            The \gui{Plugin Information} dialog opens. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            \image firstplugin-pluginsetup.png "Specify Your Plugin Details" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         \o In the \gui{Plugin name} field, type \gui{Example}. The name of the plugin | 
					
						
							|  |  |  |            is used as its identifier, and also is the base for the file names and | 
					
						
							|  |  |  |            classes in the code. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         \o The values of the following fields are mainly informational, and | 
					
						
							|  |  |  |            are shown in the detailed view in \QC's plugin overview | 
					
						
							|  |  |  |            (\gui{Help > About Plugins}, or \gui{Qt Creator > About Plugins} | 
					
						
							|  |  |  |            on Mac). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            \list | 
					
						
							|  |  |  |                \o \gui{Vendor name} is a short one-word name of the company | 
					
						
							|  |  |  |                   or organization that created the plugin. This is also used for | 
					
						
							|  |  |  |                   the path name where the plugin will be deployed to. | 
					
						
							|  |  |  |                \o \gui{Copyright} is a one-line, short copyright string. | 
					
						
							|  |  |  |                \o \gui{License} is a multi-line license text (but shouldn't be pages over pages long, | 
					
						
							|  |  |  |                   since the interface doesn't allow nice reading of long texts). | 
					
						
							|  |  |  |                \o \gui{Description} is a relatively short, but | 
					
						
							|  |  |  |                   possibly multi-line description of what the plugin does. | 
					
						
							|  |  |  |                \o \gui{URL} is a website where the user can find more | 
					
						
							|  |  |  |                   information about the plugin and/or organization providing it. | 
					
						
							|  |  |  |            \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         \o Set the \gui{Qt Creator sources} and \gui{Qt Creator build} fields to | 
					
						
							|  |  |  |            the source and build directory of the \QC | 
					
						
							|  |  |  |            instance you want to use to test your plugin with, respectively. | 
					
						
							|  |  |  |            If you don't do that correctly you will get compile errors for your | 
					
						
							|  |  |  |            plugin, and your plugin might not show up in \QC at all. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         \o In the \gui{Deploy into} list, select \gui{Qt Creator build}. This sets | 
					
						
							|  |  |  |            your .pro file up to deploy your plugin directly into your \QC build's | 
					
						
							|  |  |  |            plugin directory (requires you to have write permissions there). | 
					
						
							|  |  |  |            The other option, \gui{Local user settings}, sets your .pro file up to | 
					
						
							|  |  |  |            deploy your plugin into \QC's user plugin path | 
					
						
							| 
									
										
										
										
											2012-10-09 10:50:04 +02:00
										 |  |  |            (for example \c{~/.config/QtProject/qtcreator/plugins} on Unix systems). | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  |            We choose \gui{Qt Creator build} because we use a self-compiled | 
					
						
							|  |  |  |            \QC, and want the plugin to be only loaded by that \QC | 
					
						
							|  |  |  |            instance. | 
					
						
							|  |  |  |            Continue to the next page. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            The \gui{Project Management} dialog opens. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            \image firstplugin-summary.png "Summary of Created Files" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         \o Review the files that will be created, choose a version control | 
					
						
							|  |  |  |            system that \QC should use for your project (always a good idea!), | 
					
						
							|  |  |  |            and finish the wizard. | 
					
						
							|  |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 Building and Running the Plugin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If you passed the correct \QC source and build paths in the project | 
					
						
							|  |  |  |     wizard, your plugin should just build fine when pressing the build button. | 
					
						
							|  |  |  |     When you try to run your project, \QC will ask you for the executable to run and | 
					
						
							|  |  |  |     you are presented the following dialog: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \image firstplugin-runsettings.png "Specify the Executable to Run" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Select the path to the \QC executable from the build that you specified | 
					
						
							|  |  |  |     in the \gui{Qt Creator build} setting in the project wizard and click \gui OK. | 
					
						
							|  |  |  |     \QC starts up, and you can verify that your plugin successfully loaded | 
					
						
							|  |  |  |     by looking for a menu entry \gui{Tools > Example} and by looking for | 
					
						
							|  |  |  |     the plugin in the \gui{About Plugins} dialog. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \image firstplugin-menuitem.png "Menu Registered by the Plugin" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 File Structure | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The plugin wizard creates a set of basic files that a plugin needs or should have. | 
					
						
							|  |  |  |     We will have a look at some of them in detail in the following sections, here is a short | 
					
						
							|  |  |  |     overview: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \table | 
					
						
							|  |  |  |     \header | 
					
						
							|  |  |  |         \o File | 
					
						
							|  |  |  |         \o Role | 
					
						
							|  |  |  |     \row | 
					
						
							|  |  |  |         \o \c{Example.pluginspec.in} | 
					
						
							|  |  |  |         \o Template plugin specification. QMake creates a \c{Example.pluginspec} | 
					
						
							|  |  |  |            from this file, which is read by \QC to find out about the plugin. | 
					
						
							|  |  |  |     \row | 
					
						
							|  |  |  |         \o \c{example.pro} | 
					
						
							|  |  |  |         \o Project file, used by QMake to generate a Makefile that then is used to | 
					
						
							|  |  |  |            build the plugin. | 
					
						
							|  |  |  |     \row | 
					
						
							|  |  |  |         \o \c{example_global.h} | 
					
						
							|  |  |  |         \o Contains macro definitions that are useful when this plugin should export | 
					
						
							|  |  |  |            symbols to other plugins. | 
					
						
							|  |  |  |     \row | 
					
						
							|  |  |  |         \o \c{exampleconstants.h} | 
					
						
							|  |  |  |         \o Header defining constants used by the plugin code. | 
					
						
							|  |  |  |     \row | 
					
						
							|  |  |  |         \o \c{exampleplugin.h/.cpp} | 
					
						
							|  |  |  |         \o C++ header and source files that define the plugin class that will be | 
					
						
							|  |  |  |            instanciated and run by \QC's plugin manager. | 
					
						
							|  |  |  |     \endtable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 qmake Project | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The qmake project file \c{example.pro} defines how your plugin should be compiled. | 
					
						
							|  |  |  |     \QC plugins need to have a specific setup there, in addition to telling qmake | 
					
						
							|  |  |  |     which files need to be compiled (or handled by \c moc or \c uic). | 
					
						
							|  |  |  |     Let us have a look at what the project wizard generated for you in detail. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/example.pro 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The first section of the .pro file defines the very basic properties of your project, | 
					
						
							|  |  |  |     the name (\c{TARGET}), and that a library should be generated, | 
					
						
							|  |  |  |     since plugins are actually libraries that are dynamically loaded (\c{TEMPLATE = lib}). | 
					
						
							|  |  |  |     The section also lets the compiler pass an \c EXAMPLE_LIBRARY define to the compiled | 
					
						
							|  |  |  |     code, which is used in the \c{example_global.h} header, but is not really of interest | 
					
						
							|  |  |  |     for now. You should not need to change that section of the .pro file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/example.pro 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This section tells qmake about the files of your project that it should let | 
					
						
							|  |  |  |     compile or otherwise handle. You need to expand that section with any files | 
					
						
							|  |  |  |     you add to the project. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/example.pro 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     To compile and deploy your plugin, the project needs access to the \QC sources and | 
					
						
							|  |  |  |     build. This section contains the logic that looks for the information about | 
					
						
							|  |  |  |     the location of the sources and build in the \c{QTC_SOURCE} and \c{QTC_BUILD} | 
					
						
							|  |  |  |     environment variables. If these are not defined, it uses the defaults you | 
					
						
							|  |  |  |     set in the project wizard. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     So, if someone else opens your plugin project on their machine, they do not | 
					
						
							|  |  |  |     need to edit the .pro file, but instead they should set the \c{QTC_SOURCE} and | 
					
						
							|  |  |  |     \c{QTC_BUILD} environment variables correctly for the plugin's build environment. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     You should not need to change this section, except perhaps to adapt the defaults. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/example.pro 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \QC plugins can either be installed into the \QC installation's plugin directory | 
					
						
							|  |  |  |     (requires write access there), or to a user specific plugin directory. | 
					
						
							|  |  |  |     The \c USE_USER_DESTDIR switch in the .pro file defines which method is used for building | 
					
						
							|  |  |  |     the plugin (which is independent from what you can later use for distributing your | 
					
						
							|  |  |  |     plugin to other users). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/example.pro 5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The \c{PROVIDER} variable is for example used to deploy your plugin to a provider specific | 
					
						
							|  |  |  |     plugin subdirectory, and the value is taken from the information that | 
					
						
							|  |  |  |     you gave in the plugin project wizard. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/example.pro 6 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This section includes the necessary parts from the \QC sources and makes your | 
					
						
							|  |  |  |     plugin find the \QC libraries and plugins. The included file | 
					
						
							|  |  |  |     \c{qtcreatorplugin.pri} makes sure that you build a plugin that is suitable | 
					
						
							|  |  |  |     for use in \QC. The file \c{plugins/coreplugin/coreplugin.pri} makes your | 
					
						
							|  |  |  |     plugin dependent on the Core plugin and makes sure that you can access its | 
					
						
							|  |  |  |     public API. | 
					
						
							|  |  |  |     If you want to use or extend functionality from other plugins, you | 
					
						
							|  |  |  |     need to add the corresponding .pri file of the plugin here. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     For more information about qmake, and writing .pro files in general, | 
					
						
							| 
									
										
										
										
											2012-10-09 10:50:04 +02:00
										 |  |  |     see the \l{http://qt-project.org/doc/qt-4.8/qmake-manual.html}{qmake Manual}. | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \section1 Plugin Specification | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The .pluginspec file is an XML file that contains information that is needed by | 
					
						
							|  |  |  |     the plugin manager to find your plugin and resolve its dependencies before actually | 
					
						
							|  |  |  |     loading your plugin's library file. We will only have a short look at it here. | 
					
						
							|  |  |  |     For more information, see \l{Plugin Specifications}. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The wizard doesn't actually create a .pluginspec file directly, but instead a | 
					
						
							|  |  |  |     .pluginspec.in file. qmake uses this to generate the actual plugin specification | 
					
						
							|  |  |  |     file, replacing variables like \c{QTCREATOR_VERSION} with their actual values. | 
					
						
							|  |  |  |     Therefore you need to escape all backslashes and quotes in the .pluginspec.in file | 
					
						
							|  |  |  |     (i.e. you need to write \c{\\} to get a backslash and \c{\"} to get a quote | 
					
						
							|  |  |  |     in the generated plugin specification). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/Example.pluginspec.in 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The main tag of the plugin specification that is created by the wizard | 
					
						
							|  |  |  |     defines the name of your plugin, its version, and with what version of this plugin | 
					
						
							|  |  |  |     the current version is binary compatible with. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/Example.pluginspec.in 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     After the main tag you'll find the information about the plugin | 
					
						
							|  |  |  |     that you gave in the project wizard. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/Example.pluginspec.in 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The last section tells the plugin manager about the dependencies of this | 
					
						
							|  |  |  |     plugin. Most \QC plugins will at least depend on the \c{Core} plugin. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 Plugin Class | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The files \c{exampleplugin.h} and \c{exampleplugin.cpp} define the plugin | 
					
						
							|  |  |  |     implementation of your little plugin. We'll concentrate on some highlights | 
					
						
							|  |  |  |     here, and give pointers to more detailed information for the various parts. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section2 Header File | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The header file \c{exampleplugin.h} defines the interface of the plugin class. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/exampleplugin.h namespaces | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The plugin is defined in a \c{Example::Internal} namespace, which conforms to | 
					
						
							|  |  |  |     the coding rules for \l{coding-rules-namespacing}{namespacing} | 
					
						
							|  |  |  |     in \QC sources. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/exampleplugin.h base class | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     All \QC plugins must be derived from \l{ExtensionSystem::IPlugin} and | 
					
						
							|  |  |  |     are QObjects. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/exampleplugin.h plugin methods | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The base class defines basic methods that are called during the life cycle | 
					
						
							|  |  |  |     of a plugin, which are here implemented for your new plugin. | 
					
						
							|  |  |  |     These methods and their roles are described in detail in | 
					
						
							|  |  |  |     \l{The Plugin Life Cycle}. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/exampleplugin.h slot | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The plugin has an additional custom slot, that is used to pop up a dialog | 
					
						
							|  |  |  |     when the user chooses the menu item that this plugin adds. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section2 Source File | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The source file contains the actual implementation of the plugin, which registers | 
					
						
							|  |  |  |     a new menu and menu item, and opens a message box when that item is triggered. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     All the necessary header files from the plugin code itself, | 
					
						
							|  |  |  |     from the Core plugin, and from Qt are included in the beginning of the file. | 
					
						
							|  |  |  |     The setup of the menu and menu item | 
					
						
							|  |  |  |     is done in the plugin's \c{initialize} method, which is the first thing called | 
					
						
							|  |  |  |     after the plugin constructor. In that method, the plugin can be sure that the basic | 
					
						
							|  |  |  |     setup of plugin's that it depends on has been done, for example the Core plugin's | 
					
						
							|  |  |  |     \c{ActionManager} instance has been created. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-02 06:36:25 +01:00
										 |  |  |     For more information about implementing the plugin interface, see the | 
					
						
							|  |  |  |     \l{ExtensionSystem::IPlugin} API documentation and \l{Plugin Life Cycle}. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-10 08:32:07 +02:00
										 |  |  |     \snippet exampleplugin/exampleplugin.cpp add action | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This part of the code creates a new \c{QAction}, registers it as a new | 
					
						
							|  |  |  |     \c{Command} in the action manager, and connects it to the plugin's slot. | 
					
						
							|  |  |  |     The action manager provides a central place where the user can assign and | 
					
						
							|  |  |  |     change keyboard shortcuts, and manages cases where for example a menu item should be | 
					
						
							|  |  |  |     directed to different plugins under different circumstances, as well as a few | 
					
						
							|  |  |  |     other things. This is described in more detail in \l{Menus and Menu Items}. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/exampleplugin.cpp add menu | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Here a new menu item is created, the created command added to it, and the menu | 
					
						
							|  |  |  |     added to the \gui{Tools} menu in the menu bar. Again, this is covered in more | 
					
						
							|  |  |  |     detail in \l{Menus and Menu Items}. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/exampleplugin.cpp slot implementation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This part defines the code that is called when the menu item is triggered. | 
					
						
							|  |  |  |     It uses the Qt API to open a message box that displays informative text and | 
					
						
							|  |  |  |     an \gui OK button. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet exampleplugin/exampleplugin.cpp export plugin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     At the end of the file, the Qt macro \c{Q_EXPORT_PLUGIN2} is used to register | 
					
						
							|  |  |  |     the plugin with Qt's plugin loader system. This is necessary for Qt to | 
					
						
							|  |  |  |     be able to load your plugin. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ |