| 
									
										
										
										
											2010-06-21 15:27:59 +02:00
										 |  |  | /*! | 
					
						
							|  |  |  | \page first-plugin.html | 
					
						
							|  |  |  |     itle 2. First Plugin | 
					
						
							|  |  |  | The best way to learn about writing Qt Creator plugins is to actually start by writing the very first plugin. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | There are two ways for writing plugins for Qt Creator: | 
					
						
							|  |  |  | \list | 
					
						
							|  |  |  | \o \l {Writing plugin inside the source tree.} | 
					
						
							|  |  |  | \o \l {Writing plugin outside the source tree.} | 
					
						
							|  |  |  | \endlist | 
					
						
							|  |  |  | For Writing plugin in the any of the above mentioned way Qt Creator source scould have been compiled. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Lets keep our goals very simple for this one. We are going to provide a plugin for Qt Creator that does nothing. The purpose behind | 
					
						
							|  |  |  | this "Do nothing" plugin is to discover the basic classes in Qt Creator and to feel happy when our plugin shows up in the | 
					
						
							|  |  |  | "plugin list" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \inlineimage qtc-aboutplugin-2.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     arget {Writing plugin inside the source tree.} | 
					
						
							|  |  |  | \section1 2.1 Create a plugin project in Qt Creator | 
					
						
							|  |  |  | Create a folder called DoNothing in $$QT_CREATOR_ROOT/src/plugins directory. The entire source code of | 
					
						
							|  |  |  | the plugin will be put into this directory. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \bold {Note:}\underline {It may be possible to write and build Qt Creator plugins outside of its source tree, but it is | 
					
						
							|  |  |  | much easier to write plugins within the source tree}. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Lets first create the \c {DoNothing.pro} file with the following contents | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | TEMPLATE = lib | 
					
						
							|  |  |  | TARGET = DoNothing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PROVIDER = FooCompanyInc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | include(../../qtcreatorplugin.pri) | 
					
						
							|  |  |  | include(../../plugins/coreplugin/coreplugin.pri) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HEADERS += DoNothingPlugin.h | 
					
						
							|  |  |  | SOURCES += DoNothingPlugin.cpp | 
					
						
							|  |  |  | OTHER_FILES += DoNothing.pluginspec | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The project file configures the following aspects of the plugin: | 
					
						
							|  |  |  | \list 1 | 
					
						
							|  |  |  | \o Declares that DoNothing is a library. The output will be DoNothing.dll | 
					
						
							|  |  |  | \o Configures DoNothing to make use of settings defined in qtcreatorplugin.pri | 
					
						
							|  |  |  | \o Overrides the default destination directory to $$IDE_PLUGIN_PATH/FooCompanyInc. By default the value  | 
					
						
							|  |  |  |    will be to $$IDE_PLUGIN_PATH/Nokia | 
					
						
							|  |  |  | \o Configures DoNothing to make use of settings defined in coreplugin.pri | 
					
						
							|  |  |  | \o Provides information about the .h and .cpp files that make up the plugin | 
					
						
							|  |  |  | \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \section1 2.2 Marking the plugin for build | 
					
						
							|  |  |  | Edit the \c {$$QT_CREATOR_ROOT/src/plugins/plugins.pro } file and include the following lines at the end of | 
					
						
							|  |  |  | the file and save the changes. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | SUBDIRS += plugin_DoNothing | 
					
						
							|  |  |  | plugin_DoNothing.subdir = DoNothing | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The above lines make sure that the next time we build Qt Creator, the DoNothing plugin is compiled along with the rest | 
					
						
							|  |  |  | of Qt Creator plugins. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \section1 2.3 Implementing the plugin | 
					
						
							|  |  |  | So far we have only written the project file and marked our plugin for compilation. We now do the actual | 
					
						
							|  |  |  | implementation of the plugin. All plugins implement the IPlugin interface. Lets take a look at how the DoNothing plugin | 
					
						
							|  |  |  | implements the interface and understand it in stages. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In \c {$$QT_CREATOR_ROOT/src/plugins/DoNothing/DoNothingPluigin.h} enter the following code. | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | #ifndef DONOTHINGPLUGIN_H | 
					
						
							|  |  |  | #define DONOTHINGPLUGIN_H | 
					
						
							|  |  |  | #include <extensionsystem/iplugin.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DoNothingPlugin : public ExtensionSystem::IPlugin | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     DoNothingPlugin(); | 
					
						
							|  |  |  |     ~DoNothingPlugin(); | 
					
						
							|  |  |  |     void extensionsInitialized(); | 
					
						
							|  |  |  |     bool initialize(const QStringList & arguments, QString * errorString); | 
					
						
							|  |  |  |     void shutdown(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #endif // DONOTHINGPLUGIN_H | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | As you can see the DoNothingPlugin class implements the IPlugin interface and nothing else. Lets look at how the | 
					
						
							|  |  |  | functions are implemented. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | #include "DoNothingPlugin.h" | 
					
						
							|  |  |  | #include <QtPlugin> | 
					
						
							|  |  |  | #include <QStringList> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DoNothingPlugin::DoNothingPlugin() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Do nothing | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DoNothingPlugin::~DoNothingPlugin() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Do notning | 
					
						
							|  |  |  | }    | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | Apart from initializing local (non widget and non action) variables; the constructor and destructor don't do much else. | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Q_UNUSED(args); | 
					
						
							|  |  |  |     Q_UNUSED(errMsg); | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The \bold initialize() method is called when Qt Creator wants the plugin to initialize itself. This function is ideally used to | 
					
						
							|  |  |  | initialize the internal state of the plugin and register actions/objects with Qt Creator. The function is called after all the | 
					
						
							|  |  |  | dependencies of this plugin have been loaded. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Since our plugin really does nothing, we return \bold {true} signifying that the initialization was successful. If the initialization | 
					
						
							|  |  |  | was unsuccessful (for some wired reason); the \bold {errMsg} string should be set to a human readable error message. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | void DoNothingPlugin::extensionsInitialized() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Do nothing | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The \bold extensionsInitialized() method is called after this plugin has been initialized (ie. after initialize() method has been | 
					
						
							|  |  |  | called). This method is called on plugins that depend on this plugin first. | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | void DoNothingPlugin::shutdown() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Do nothing | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | The \bold shutdown() method is called when the plugin is about to be unloaded. | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | Q_EXPORT_PLUGIN(DoNothingPlugin) | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | Finally we export the plugin class by making use of the \bold {Q_EXPORT_PLUGIN()} macro. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \section1 2.4 Writing the pluginspec file | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Each plugin should accompany a pluginspec file that provides some meta data about the plugin. For our plugin the | 
					
						
							|  |  |  | pluginspec file is as follows | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | <plugin name="DoNothing" version="0.0.1"> | 
					
						
							|  |  |  |     <vendor>FooCompanyInc</vendor> | 
					
						
							|  |  |  |     <copyright>(C) 2009-2010 FooCompanyInc Pvt. Ltd.</copyright> | 
					
						
							|  |  |  |     <license>Do anything you want</license> | 
					
						
							|  |  |  |     <description>A plugin that does nothing</description> | 
					
						
							|  |  |  |     <url>http://www.FooCompanyInc.com</url> | 
					
						
							|  |  |  |     <dependencyList> | 
					
						
							|  |  |  |         <dependency name="Core"/> | 
					
						
							|  |  |  |     </dependencyList> | 
					
						
							|  |  |  | </plugin> | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | The pluginspec file provides the following fields of information: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \list 1 | 
					
						
							|  |  |  | \o Name of the plugin, which is also used as the name of the library file that provides the plugin implementation. | 
					
						
							|  |  |  |   (In our case DoNothing.dll on Windows, libDoNothing.so on Unix) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \o Version of the plugin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \o Vendor name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \o Copyright | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \o License text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \o Description | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \o URL of the plugin vendor | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \o Dependency List provides all the plugins that this plugin depends on. Qt Creator ensures that dependencies | 
					
						
							|  |  |  |    are loaded and initialized before this plugin. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \bold {Note:}\underline {The pluginspec file should be in the same directory as the plugin's project file. Just to make things clear, the | 
					
						
							|  |  |  | contents of the DoNothing plugin directory is as shown below} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \inlineimage qtc-plugindirectory-2.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \section1 2.5 Compiling the plugin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Open a command prompt and move to the Qt Creator build directory (the same build directory you created in the | 
					
						
							|  |  |  | previous chapter). Execute the following commands | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | qmake ..\qtcreator.pro -recursive | 
					
						
							|  |  |  | nmake | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | After nmake returns, you will notice a FooCompanyInc folder within plugins folder whose contents are shown in the image | 
					
						
							|  |  |  | below. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \inlineimage qtc-compiledplugin-2.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \section1 2.6 Check out the new plugin | 
					
						
							|  |  |  | Launch (or relaunch) Qt Creator and notice that the "Installed Plugins" dialog box now reports that DoNothing plugin | 
					
						
							|  |  |  | was infact loaded and initialized. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \inlineimage qtc-installedplugin-2.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In the coming chapters we will learn to write more complicated plugins for Qt Creator. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     arget {Writing plugin outside the source tree.} | 
					
						
							|  |  |  | \section1 2.7 Building out-of-source plugins | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Thus far we have understood how to build plugins within the source tree of Qt Creator. It may not be practical for us to | 
					
						
							|  |  |  | use the Qt Creator source tree for plugin development all the time. Suppose that you are the author of a specialized | 
					
						
							|  |  |  | library (or application) and you want integrate your product into Qt Creator. Since you are a 3rd party developer you | 
					
						
							|  |  |  | cannot expect to have your code in Qt Creator source tree all the time. In this section we will look at how to build | 
					
						
							|  |  |  | plugins that are outside the Qt Creator source tree. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \section2 2.7.1 The plugin project file | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The whole magic of out-of-source plugin builds lies in the project (.pro) file of your plugin. Lets the DoNothing plugin | 
					
						
							|  |  |  | discussed in the previous section and modify (its ".pro" file) so that plugins can be built from a directory outside Qt | 
					
						
							|  |  |  | Creator source. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following table lists out the directory structure | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-21 16:59:54 +02:00
										 |  |  | \table | 
					
						
							| 
									
										
										
										
											2010-06-21 15:27:59 +02:00
										 |  |  | \header | 
					
						
							|  |  |  | \o Description | 
					
						
							|  |  |  | \o Directory | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  \row  | 
					
						
							|  |  |  |  \o   Qt Creator Source Code  | 
					
						
							|  |  |  |  \o   C:\\Work\\QtCreator  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  \row | 
					
						
							|  |  |  |  \o Qt Creator Build Directory  | 
					
						
							|  |  |  |  \o C:\\Work\\QtCreator\\build | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  \row | 
					
						
							|  |  |  |  \o DoNothing Plugin Source  | 
					
						
							|  |  |  |  \o C:\\Work\\Research\\QtCreator\\Plugins\\DoNothing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This directory currently contains | 
					
						
							|  |  |  |     \list | 
					
						
							|  |  |  |     \o DoNothing.pluginspec | 
					
						
							|  |  |  |     \o DoNothing.pro | 
					
						
							|  |  |  |     \o DoNothingPlugin.cpp | 
					
						
							|  |  |  |     \o DoNothingPlugin.h | 
					
						
							|  |  |  |     \endlist | 
					
						
							|  |  |  | \row  | 
					
						
							|  |  |  | \o Target plugin directory | 
					
						
							|  |  |  | \o C:\\Work\\QtCreator\\build\\lib\\qtcreator\\plugins\\FooCompanyInc    | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  \endtable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Let's now modify the DoNothing.pro file in C:\\Work\\Research\\QtCreator\\Plugins\\DoNothing as follows. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | QTC_SOURCE = C:/Work/QtCreator/ | 
					
						
							|  |  |  | QTC_BUILD = C:/Work/QtCreator/build/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEMPLATE = lib | 
					
						
							|  |  |  | TARGET = DoNothing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | IDE_SOURCE_TREE = $$QTC_SOURCE | 
					
						
							|  |  |  | IDE_BUILD_TREE = $$QTC_BUILD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PROVIDER = FooCompanyInc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LIBS += -L$$IDE_PLUGIN_PATH/Nokia | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | include($$QTC_SOURCE/src/qtcreatorplugin.pri) | 
					
						
							|  |  |  | include($$QTC_SOURCE/src/plugins/coreplugin/coreplugin.pri) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HEADERS = DoNothingPlugin.h | 
					
						
							|  |  |  | SOURCES = DoNothingPlugin.cpp | 
					
						
							|  |  |  | OTHER_FILES = DoNothingPlugin.pluginspec | 
					
						
							|  |  |  | \endcode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The \bold{QTC_SOURCE} and \bold {QTC_BUILD} variables in the project file point to the source and build directories of Qt Creator. | 
					
						
							|  |  |  | If you prefer setting these as environment variables, then use \bold{$$(QTC_BUILD)} instead of \bold{$$QTC_BUILD} in the | 
					
						
							|  |  |  | project file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The \bold {IDE_SOURCE_TREE} and \bold {IDE_BUILD_TREE} variables are used by qtcreatorplugin.pri to establish the include | 
					
						
							|  |  |  | and library paths. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The \bold {PROVIDER} and \bold {DESTDIR} directories must be set before including qtcreatorplugin.pri. This is because the variables | 
					
						
							|  |  |  | will be provided default values are \bold {Nokia} and \bold {$$IDE_BUILD_TREE/lib/qtcreator/plugins/Nokia} otherwise. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | By default qtcreatorplugin.pri assumes that all the libs that a plugin may depend on are present inside the \bold {DESTDIR}. If | 
					
						
							|  |  |  | our \bold {DESTDIR} is different from the default (Nokia) one, then we will need to explicitly set that. The remaining things are | 
					
						
							|  |  |  | just the same. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \section2 2.7.2 Compiling the plugin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Once the project file has been created, we make use of the standard qmake and make commands to compile the plugin. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \code | 
					
						
							|  |  |  | C:\Work\Research\QtCreator\Plugins\DoNothing>qmake | 
					
						
							|  |  |  | C:\Work\Research\QtCreator\Plugins\DoNothing>nmake | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Microsoft (R) Program Maintenance Utility Version 8.00.50727.762 | 
					
						
							|  |  |  | Copyright (C) Microsoft Corporation. All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "C:\Program Files\Microsoft Visual Studio 8\VC\BIN\nmake.exe" -f Makefile.Debug | 
					
						
							|  |  |  | Microsoft (R) Program Maintenance Utility Version 8.00.50727.762 | 
					
						
							|  |  |  | Copyright (C) Microsoft Corporation. All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | copy /y "DoNothing.pluginspec" | 
					
						
							|  |  |  | "..\..\..\..\QtCreator\build\lib\qtcreator\plugins\FooCompanyInc\DoNothing.pluginspec" | 
					
						
							|  |  |  | 1 file(s) copied. | 
					
						
							|  |  |  | ........................................ | 
					
						
							|  |  |  | mt.exe -nologo -manifest "debug\DoNothingd.intermediate.manifest" - | 
					
						
							|  |  |  | outputresource:..\..\..\..\QtCreator\build\lib\qtcreator\plugins\FooCompanyInc\DoNothingd.dll;2 | 
					
						
							|  |  |  | C:\Work\Research\QtCreator\Plugins\DoNothing> | 
					
						
							|  |  |  | \endcode     | 
					
						
							|  |  |  | */ |