forked from qt-creator/qt-creator
328 lines
11 KiB
Plaintext
328 lines
11 KiB
Plaintext
/*!
|
|
\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
|
|
|
|
\table
|
|
\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
|
|
*/
|