Start on Creating Plugins documentation.
Change-Id: Ic75775473cfb405cee5c53b2dc24144dba51a25c Reviewed-by: Leena Miettinen <riitta-leena.miettinen@nokia.com>
@@ -517,6 +517,7 @@
|
||||
|
||||
\section1 Patterns and Practices
|
||||
|
||||
\target coding-rules-namespacing
|
||||
\section2 Namespacing
|
||||
|
||||
Read \l {http://wiki.qt-project.org/index.php/Qt_In_Namespace}{Qt In Namespace}
|
||||
|
68
doc/api/creating-plugins.qdoc
Normal file
@@ -0,0 +1,68 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (info@qt.nokia.com)
|
||||
**
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at info@qt.nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/*!
|
||||
\page creating-plugins.html
|
||||
\title Creating Plugins
|
||||
|
||||
At its very core, \QC consists of a plugin loader that loads
|
||||
and runs a set of plugins, which then actually provide the functionality
|
||||
that you know from \QC the IDE. So, even the main application window
|
||||
and menus are all provided by plugins. Plugins can use different means
|
||||
to provide other plugins access to their functionality and to allow them
|
||||
to extend certain aspects of the application.
|
||||
|
||||
For example the "Core" plugin, which is the very basic plugin that must be
|
||||
present for \QC to run at all, provides the main window itself, and API
|
||||
for adding menu items, modes, editor types, navigation panels and many other
|
||||
things.
|
||||
The "TextEditor" plugin provides a framework and base implementation for
|
||||
different text editors with highlighting, completion and folding, that
|
||||
is then used by other plugins to add more specialized text editor types
|
||||
to \QC, like for editing C/C++ or .pro files.
|
||||
|
||||
After reading this guide you will know what a basic plugin consists of,
|
||||
how to write a plugin specification file, what the lifecycle of a plugin is,
|
||||
what the general principles for extending existing plugins'
|
||||
functionality and providing interfaces for other plugins are, and will
|
||||
be able to write your first plugin.
|
||||
|
||||
\section1 Basics
|
||||
\list
|
||||
\o \l{Getting and Building Qt Creator}
|
||||
\o \l{Creating Your First Plugin}
|
||||
\o \l{Plugin Specifications}
|
||||
\o \l{Plugin Life Cycle}
|
||||
\endlist
|
||||
|
||||
\section1 Design Principles
|
||||
\list
|
||||
\o \l{The Plugin Manager, the Object Pool, and Registered Objects}
|
||||
\o \l{Aggregations}
|
||||
\o \l{Extending and Providing Interfaces}
|
||||
\endlist
|
||||
|
||||
\section1 Creating 3rd-Party Plugins
|
||||
\list
|
||||
\o \l{A Note on Binary Compatibility}
|
||||
\o \l{Creating User-Installable Plugins}
|
||||
\endlist
|
||||
*/
|
17
doc/api/examples/exampleplugin/Example.pluginspec.in
Normal file
@@ -0,0 +1,17 @@
|
||||
//! [1]
|
||||
<plugin name=\"Example\" version=\"0.0.1\" compatVersion=\"0.0.1\">
|
||||
//! [1]
|
||||
//! [2]
|
||||
<vendor>MyCompany</vendor>
|
||||
<copyright>(C) MyCompany</copyright>
|
||||
<license>BSD</license>
|
||||
<description>Minimal plugin example</description>
|
||||
<url>http://www.mycompany.com</url>
|
||||
//! [2]
|
||||
//! [3]
|
||||
<dependencyList>
|
||||
<dependency name=\"Core\" version=\"$$QTCREATOR_VERSION\"/>
|
||||
</dependencyList>
|
||||
//! [3]
|
||||
</plugin>
|
||||
|
50
doc/api/examples/exampleplugin/example.pro
Normal file
@@ -0,0 +1,50 @@
|
||||
#! [1]
|
||||
TARGET = Example
|
||||
TEMPLATE = lib
|
||||
|
||||
DEFINES += EXAMPLE_LIBRARY
|
||||
#! [1]
|
||||
|
||||
# Example files
|
||||
|
||||
#! [2]
|
||||
SOURCES += exampleplugin.cpp
|
||||
|
||||
HEADERS += exampleplugin.h\
|
||||
example_global.h\
|
||||
exampleconstants.h
|
||||
#! [2]
|
||||
|
||||
# Qt Creator linking
|
||||
|
||||
#! [3]
|
||||
## set the QTC_SOURCE environment variable to override the setting here
|
||||
QTCREATOR_SOURCES = $$(QTC_SOURCE)
|
||||
isEmpty(QTCREATOR_SOURCES):QTCREATOR_SOURCES=/Users/example/qtcreator-src
|
||||
|
||||
## set the QTC_BUILD environment variable to override the setting here
|
||||
IDE_BUILD_TREE = $$(QTC_BUILD)
|
||||
isEmpty(IDE_BUILD_TREE):IDE_BUILD_TREE=/Users/example/qtcreator-build
|
||||
#! [3]
|
||||
|
||||
#! [4]
|
||||
## uncomment to build plugin into user config directory
|
||||
## <localappdata>/plugins/<ideversion>
|
||||
## where <localappdata> is e.g.
|
||||
## "%LOCALAPPDATA%\Nokia\qtcreator" on Windows Vista and later
|
||||
## "$XDG_DATA_HOME/Nokia/qtcreator" or "~/.local/share/Nokia/qtcreator" on Linux
|
||||
## "~/Library/Application Support/Nokia/Qt Creator" on Mac
|
||||
# USE_USER_DESTDIR = yes
|
||||
#! [4]
|
||||
|
||||
#![5]
|
||||
PROVIDER = MyCompany
|
||||
#![5]
|
||||
|
||||
#![6]
|
||||
include($$QTCREATOR_SOURCES/src/qtcreatorplugin.pri)
|
||||
include($$QTCREATOR_SOURCES/src/plugins/coreplugin/coreplugin.pri)
|
||||
|
||||
LIBS += -L$$IDE_PLUGIN_PATH/Nokia
|
||||
#![6]
|
||||
|
13
doc/api/examples/exampleplugin/example_global.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef EXAMPLE_GLOBAL_H
|
||||
#define EXAMPLE_GLOBAL_H
|
||||
|
||||
#include <QtCore/QtGlobal>
|
||||
|
||||
#if defined(EXAMPLE_LIBRARY)
|
||||
# define EXAMPLESHARED_EXPORT Q_DECL_EXPORT
|
||||
#else
|
||||
# define EXAMPLESHARED_EXPORT Q_DECL_IMPORT
|
||||
#endif
|
||||
|
||||
#endif // EXAMPLE_GLOBAL_H
|
||||
|
14
doc/api/examples/exampleplugin/exampleconstants.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef EXAMPLECONSTANTS_H
|
||||
#define EXAMPLECONSTANTS_H
|
||||
|
||||
namespace Example {
|
||||
namespace Constants {
|
||||
|
||||
const char ACTION_ID[] = "Example.Action";
|
||||
const char MENU_ID[] = "Example.Menu";
|
||||
|
||||
} // namespace Example
|
||||
} // namespace Constants
|
||||
|
||||
#endif // EXAMPLECONSTANTS_H
|
||||
|
88
doc/api/examples/exampleplugin/exampleplugin.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
#include "exampleplugin.h"
|
||||
#include "exampleconstants.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/icontext.h>
|
||||
#include <coreplugin/actionmanager/actionmanager.h>
|
||||
#include <coreplugin/actionmanager/command.h>
|
||||
#include <coreplugin/actionmanager/actioncontainer.h>
|
||||
#include <coreplugin/coreconstants.h>
|
||||
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QMessageBox>
|
||||
#include <QtGui/QMainWindow>
|
||||
#include <QtGui/QMenu>
|
||||
|
||||
#include <QtCore/QtPlugin>
|
||||
|
||||
using namespace Example::Internal;
|
||||
|
||||
ExamplePlugin::ExamplePlugin()
|
||||
{
|
||||
// Create your members
|
||||
}
|
||||
|
||||
ExamplePlugin::~ExamplePlugin()
|
||||
{
|
||||
// Unregister objects from the plugin manager's object pool
|
||||
// Delete members
|
||||
}
|
||||
|
||||
bool ExamplePlugin::initialize(const QStringList &arguments, QString *errorString)
|
||||
{
|
||||
// Register objects in the plugin manager's object pool
|
||||
// Load settings
|
||||
// Add actions to menus
|
||||
// Connect to other plugins' signals
|
||||
// In the initialize method, a plugin can be sure that the plugins it
|
||||
// depends on have initialized their members.
|
||||
|
||||
Q_UNUSED(arguments)
|
||||
Q_UNUSED(errorString)
|
||||
|
||||
//! [add action]
|
||||
Core::ActionManager *am = Core::ICore::instance()->actionManager();
|
||||
|
||||
QAction *action = new QAction(tr("Example action"), this);
|
||||
Core::Command *cmd = am->registerAction(action, Constants::ACTION_ID,
|
||||
Core::Context(Core::Constants::C_GLOBAL));
|
||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Alt+Meta+A")));
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(triggerAction()));
|
||||
//! [add action]
|
||||
//! [add menu]
|
||||
Core::ActionContainer *menu = am->createMenu(Constants::MENU_ID);
|
||||
menu->menu()->setTitle(tr("Example"));
|
||||
menu->addAction(cmd);
|
||||
am->actionContainer(Core::Constants::M_TOOLS)->addMenu(menu);
|
||||
//! [add menu]
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ExamplePlugin::extensionsInitialized()
|
||||
{
|
||||
// Retrieve objects from the plugin manager's object pool
|
||||
// In the extensionsInitialized method, a plugin can be sure that all
|
||||
// plugins that depend on it are completely initialized.
|
||||
}
|
||||
|
||||
ExtensionSystem::IPlugin::ShutdownFlag ExamplePlugin::aboutToShutdown()
|
||||
{
|
||||
// Save settings
|
||||
// Disconnect from signals that are not needed during shutdown
|
||||
// Hide UI (if you add UI that is not in the main window directly)
|
||||
return SynchronousShutdown;
|
||||
}
|
||||
|
||||
//! [slot implementation]
|
||||
void ExamplePlugin::triggerAction()
|
||||
{
|
||||
QMessageBox::information(Core::ICore::instance()->mainWindow(),
|
||||
tr("Action triggered"),
|
||||
tr("This is an action from Example."));
|
||||
}
|
||||
//! [slot implementation]
|
||||
|
||||
//! [export plugin]
|
||||
Q_EXPORT_PLUGIN2(Example, ExamplePlugin)
|
||||
//! [export plugin]
|
39
doc/api/examples/exampleplugin/exampleplugin.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef EXAMPLE_H
|
||||
#define EXAMPLE_H
|
||||
|
||||
#include "example_global.h"
|
||||
|
||||
#include <extensionsystem/iplugin.h>
|
||||
|
||||
//! [namespaces]
|
||||
namespace Example {
|
||||
namespace Internal {
|
||||
//! [namespaces]
|
||||
|
||||
//! [base class]
|
||||
class ExamplePlugin : public ExtensionSystem::IPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
//! [base class]
|
||||
|
||||
public:
|
||||
ExamplePlugin();
|
||||
~ExamplePlugin();
|
||||
|
||||
//! [plugin methods]
|
||||
bool initialize(const QStringList &arguments, QString *errorString);
|
||||
void extensionsInitialized();
|
||||
ShutdownFlag aboutToShutdown();
|
||||
//! [plugin methods]
|
||||
|
||||
//! [slot]
|
||||
private slots:
|
||||
void triggerAction();
|
||||
//! [slot]
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Example
|
||||
|
||||
#endif // EXAMPLE_H
|
||||
|
334
doc/api/first-plugin.qdoc
Normal file
@@ -0,0 +1,334 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (info@qt.nokia.com)
|
||||
**
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at info@qt.nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/*!
|
||||
\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
|
||||
\o Select \gui{File > New File or Project > Other Qt Project > Qt Creator Plugin > Choose}.
|
||||
|
||||
\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.
|
||||
|
||||
The \gui{Target Setup} dialog opens.
|
||||
|
||||
\image firstplugin-target.png "Choose the Desktop Target and Matching Qt"
|
||||
|
||||
\o Select the target and Qt version to build your project with.
|
||||
For a \QC plugin this needs to be the \gui{Desktop} target,
|
||||
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
|
||||
(for example \c{~/.config/Nokia/qtcreator/plugins} on Unix systems).
|
||||
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,
|
||||
see the \l{http://doc.qt.nokia.com/4.7/qmake-manual.html}{qmake Manual}.
|
||||
|
||||
\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.
|
||||
|
||||
\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.
|
||||
|
||||
*/
|
100
doc/api/getting-and-building.qdoc
Normal file
@@ -0,0 +1,100 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (info@qt.nokia.com)
|
||||
**
|
||||
**
|
||||
** 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.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at info@qt.nokia.com.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
/*!
|
||||
\page getting-and-building.html
|
||||
\title Getting and Building Qt Creator
|
||||
|
||||
\code
|
||||
TODO: This should be extended.
|
||||
* How to avoid building Qt
|
||||
* Windows specific hassle, see README in \QC sources
|
||||
\endcode
|
||||
|
||||
There are several reasons why you might want to do your own build of \QC,
|
||||
like using the most current development version and being able to tweak
|
||||
\QC at one or the other place. It is also necessary if you want to
|
||||
create your own \QC plugin.
|
||||
|
||||
\section1 Getting and Building Qt
|
||||
|
||||
\QC usually uses the latest stable release of Qt,
|
||||
you can see the exact minimum requirement at the top of \QC's qtcreator.pro.
|
||||
(You can find the current version in our source repository here:
|
||||
\l{https://qt.gitorious.org/qt-creator/qt-creator/blobs/master/qtcreator.pro}.)
|
||||
|
||||
You find the sources for the different Qt versions for example on our gitorious repository
|
||||
\l{http://qt.gitorious.org/qt}.
|
||||
|
||||
\QC requires private headers of Qt, which are unfortunately not installed
|
||||
by the Qt binary packages, and also are not copied to the installation directory when
|
||||
using \c{make install} on a self-compiled Qt. To solve this problem
|
||||
configure Qt with the \c{-developer-build} option, which sets the install
|
||||
directory to the build directory itself (you are not required to run
|
||||
\c{make install} in that case).
|
||||
In Linux and Mac terminals, enter the following commands:
|
||||
\code
|
||||
cd <QtSources>
|
||||
./configure -developer-build
|
||||
make
|
||||
\endcode
|
||||
On Windows, open a command prompt where your developer tools are set up, and enter
|
||||
the following commands for MSVC builds
|
||||
\code
|
||||
cd <QtSources>
|
||||
configure -developer-build
|
||||
nmake
|
||||
\endcode
|
||||
|
||||
If you really need to use a Qt build that does not have private headers in its
|
||||
installation directory, you can set the \c{QT_PRIVATE_HEADERS} qmake variable
|
||||
to the include path which contains them, when running qmake on the \QC
|
||||
sources (see below).
|
||||
|
||||
\section1 Getting and Building \QC
|
||||
|
||||
You can get the \QC sources for a specific version either by using one of the
|
||||
released source bundles, or from the Gitorious repository
|
||||
\l{http://qt.gitorious.org/qt-creator}. If you intend to contribute to \QC
|
||||
itself, you should use the repository from our Gerrit review tool as described
|
||||
in the developer wiki here: \l{http://wiki.qt-project.org/Setting_up_Gerrit}.
|
||||
|
||||
We strongly encourage you to do out-of-source builds of \QC (also called
|
||||
shadow-builds).
|
||||
After you put the \QC sources somewhere (lets call the path \c{<QtCreatorSources>})
|
||||
you build it on Linux and Mac with
|
||||
\code
|
||||
cd <QtCreatorSources>/..
|
||||
mkdir qtcreator-build
|
||||
cd qtcreator-build
|
||||
<QtInstall>/bin/qmake -r <QtCreatorSources>
|
||||
make
|
||||
\endcode
|
||||
or the corresponding commands on Windows systems.
|
||||
|
||||
If your Qt installation does not contain private headers (see above), you can point \QC
|
||||
to the private headers by setting the \c{QT_PRIVATE_HEADERS} qmake variable
|
||||
to the include directory that contains them. On Linux and Mac, enter the following command
|
||||
instead of the qmake call above:
|
||||
\code
|
||||
<QtInstall>/bin/qmake -r QT_PRIVATE_HEADERS=<QtSources>/include <QtCreatorSources>
|
||||
\endcode
|
||||
*/
|
BIN
doc/api/images/firstplugin-menuitem.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
doc/api/images/firstplugin-nameandpath.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
doc/api/images/firstplugin-pluginsetup.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
doc/api/images/firstplugin-runsettings.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
doc/api/images/firstplugin-summary.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
doc/api/images/firstplugin-target.png
Normal file
After Width: | Height: | Size: 98 KiB |
BIN
doc/api/images/firstplugin-wizard.png
Normal file
After Width: | Height: | Size: 41 KiB |
@@ -22,7 +22,6 @@
|
||||
/*!
|
||||
\page index.html
|
||||
\title Extending Qt Creator Manual
|
||||
\nextpage
|
||||
|
||||
Qt Creator is a cross-platform integrated development environment (IDE)
|
||||
tailored to the needs of Qt developers.
|
||||
|
@@ -41,9 +41,9 @@ showinternal = true
|
||||
headers.fileextensions = "*.h"
|
||||
sources.fileextensions = "*.cpp *.qdoc"
|
||||
|
||||
imagedirs = $SRCDIR/images $SRCDIR/templates/images
|
||||
imagedirs = $SRCDIR/api/images $SRCDIR/images $SRCDIR/templates/images
|
||||
outputdir = $OUTDIR
|
||||
exampledirs = ../api/examples
|
||||
exampledirs = $SRCDIR/api/examples
|
||||
indexes = qt.index
|
||||
|
||||
include(compat.qdocconf)
|
||||
|
@@ -51,6 +51,9 @@ DEV_HELP_DEP_FILES = \
|
||||
$$PWD/api/external-tool-spec.qdoc \
|
||||
$$PWD/api/qtcreator-dev.qdoc \
|
||||
$$PWD/api/qtcreator-dev-wizards.qdoc \
|
||||
$$PWD/api/creating-plugins.qdoc \
|
||||
$$PWD/api/getting-and-building.qdoc \
|
||||
$$PWD/api/first-plugin.qdoc \
|
||||
$$PWD/api/qtcreator-dev.qdocconf
|
||||
|
||||
dev_html_docs.commands = $$qdoc($$OUT_PWD/doc/html-dev) $$PWD/api/qtcreator-dev.qdocconf
|
||||
|
@@ -33,9 +33,9 @@ bool %PluginName%Plugin::initialize(const QStringList &arguments, QString *error
|
||||
// Register objects in the plugin manager's object pool
|
||||
// Load settings
|
||||
// Add actions to menus
|
||||
// connect to other plugins' signals
|
||||
// "In the initialize method, a plugin can be sure that the plugins it
|
||||
// depends on have initialized their members."
|
||||
// Connect to other plugins' signals
|
||||
// In the initialize method, a plugin can be sure that the plugins it
|
||||
// depends on have initialized their members.
|
||||
|
||||
Q_UNUSED(arguments)
|
||||
Q_UNUSED(errorString)
|
||||
@@ -58,8 +58,8 @@ bool %PluginName%Plugin::initialize(const QStringList &arguments, QString *error
|
||||
void %PluginName%Plugin::extensionsInitialized()
|
||||
{
|
||||
// Retrieve objects from the plugin manager's object pool
|
||||
// "In the extensionsInitialized method, a plugin can be sure that all
|
||||
// plugins that depend on it are completely initialized."
|
||||
// In the extensionsInitialized method, a plugin can be sure that all
|
||||
// plugins that depend on it are completely initialized.
|
||||
}
|
||||
|
||||
ExtensionSystem::IPlugin::ShutdownFlag %PluginName%Plugin::aboutToShutdown()
|
||||
|