Показаны сообщения с ярлыком Qt Creator Plugin. Показать все сообщения
Показаны сообщения с ярлыком Qt Creator Plugin. Показать все сообщения

пятница, 7 января 2011 г.

Плагин для макросов

Не знаю, часто ли у других возникает необходимость полностью чистить проект для того, чтобы его нормально собрать, но у меня перидически возникает. Например, ребилд перестает работать после ошибки линкера, когда метод объявлен, но не реализован. Лечится это просто- Clean, затем Build, но хотелось бы, чтобы все это висело на одной кнопке.

Мир- он все же не без добрых людей. Вот здесь в репозитории плагинов лежит исходный код плагина macros. После минимальных исправлений, плагин собрался для Qt Creator 2.1 RC1, и я его сразу же попробовал.

Ну, что сказать. Плагин пока не доделан. Записывается только один макрос, и то в память, не в файл. Работает только для редактора, т.е. если страница Edit неактивна, то записать или проиграть макрос нельзя. И еще одно- горячие клавиши у плагина- Alt-( и Alt-). Alt-) совпадает с Alt-0, что не есть здорово. Может, они на самом деле Alt-Shift-9 и Alt-Shift-0, не знаю.

Из хороших новостей пока только одна- плагин, вроде бы, регулярно обновляется. Будем ждать когда допилят...

понедельник, 3 января 2011 г.

Пишем плагин для Qt Creator - часть 3

Я в отпуске, так что появилось время написать следующую серию про создание плагинов для Qt Creator. Предыдущий пост на ту же тему Сборка и отладка плагинов для Qt Creator 2.1 практически заменяет вот эти две старые части:
Итак,

Часть 3 - Настройки плагина
В этой части речь пойдет про создание страницы в диалоге Tools->Options. Для эксперимента возьмем уже существующую страницу установок C++. Можно добавить свою, но интереснее добавить таб вот сюда:



...чтобы в итоге получилось вот что:



Мы будем использовать тот же плагин DoNothing, что и в предыдущих постах.
Да, чуть не забыл. Версия Qt Creator- 2.1 RC 1 (2.0.94). Версия Qt- 4.7.1.

Категория плагина
Перед тем, как начать конструировать страницу опций, определим категорию плагина. Это может быть как одна из уже существуюших категорий (Build Systems, C++, Version Control и т.д.), так и абсолютно новая категория. Категория- это ветка в окне Installed Plugins, которое вызывается из меню Help->About Plugins. На рисунке внизу DoNothing живет в своей собственной категории Useless:



Категория задается в спеке плагина donothing.pluginspec строкой:
<category>Useless</category>
В дальнейшем будем использовать уже существующую категорию "C++".

Зависимости
В спек и в файл проекта надо добавить две зависимости- Project Explorer и CppTools.

Настройки плагина
В Qt Creator для настроек есть диалог Options. Понятно, что нам надо создать виджеты для этого диалога, сделать их доступными для Qt Creator и научить наш плагин получать информации от виджетов.
Настроек добавим две- option1CheckBox и option2CheckBox. Они будут частью виджета DoNothingSettingsWidget:



Внутреннее устройство
Для работы понадобятся четыре класса:
  • DoNothingSettings - собственно определяет настройки плагина (bool option1 и option2) и методы readSettings() и writeSettings() для загрузки при запуске Qt Creator и сохранения настроек при их изменении пользователем;
  • DoNothingSettingsPageWidget - наследуется от QWidget и содержит наш виджет. Также определяет геттер и сеттер для настроек, т.е. транслирует ГУЙ в bool и обратно. Также он реализует метод searchKeywords() для поддержки класса страницы DoNothingSettingsPage, о котором ниже;
  • DoNothingSettingsPage - наследуется от Core::IOptionsPage, содержит указатель на DoNothingSettingsPageWidget и отвечает за работу страницы настроек в целом. Он определяет унаследованные методы для регистрации и работы страницы настроек(createPage(), apply(), matches(), id(), displayName() и пр.). Именно этот класс позволяет добавить наш виджет в любую страницу настроек;
  • DoNothingPlugin - собственно класс плагина. Нследуется от IPlugin, содержит экземпляр класса DoNothingSettings и указатель на страницу настроек. Этот класс определяет работу всего плагина. Для нас сейчас выжны методы initialize(), и геттер и сеттер для настроек.
Надо отметить, что различные плагины в Qt Creator по-разному хранят настройки. В одних реализациях экземпляр класса XxxSettings принадлежит XxxSeetingsPageWidget или XxxSettingsPage, в других- самому плагину, как в моем примере.
Как же удается добавить наш новый таб в существующую страницу настроек? Класс DoNothingSettingsPage определяет методы category() и displayCategory(). Также он определяет и иконку, которая будет отображаться на нашей странице- categoryIcon(). Практически, все, что надо сделать, это:

QString DoNothingSettingsPage::category() const
{
return QLatin1String("I.C++");
}

QString DoNothingSettingsPage::displayCategory() const
{
return QCoreApplication::translate("DoNothing", QT_TRANSLATE_NOOP("DoNothing", "C++");
}

QIcon DoNothingSettingsPage::categoryIcon() const
{
return QIcon(QLatin1String(":/core/images/category_cpp.png"));
}

В методе DoNothingPlugin::initialize() надо создать страницу настроек с помощью:

// create the settings page and add a tab to the chosen category
doNothingSettingsPage = new DoNothingSettingsPage();
addAutoReleasedObject(doNothingSettingsPage);

Файлы плагина
В принципе, вот такие файлы надо будет создать:
  • donothingsettingswidget.ui - содержит ГУЙ нашешего виджета;
  • donthingconstants.h - содержит константы для класса DoNothingSettingsPage и DoNothingSettings;
  • donothingsettings.h (и donothingsettings.cpp) - содержит класс DoNothingSettings и операторы == и != над ним;
  • donothingsettingspage.h (donothingsettingspage.cpp) - содержит классы DoNothingSettingsPageWidget и DoNothingSettingsPage.
Имена файлов- традиционные для плагинов Qt Creator.

Исходный код
Я не стал здесь приводить исходный код, все равно проще его смотреть в самом креаторе. Код можно скачать отсюда: QtCreatorPlugins-Part3.zip. Надо просто создать папку и разархивировать в нее.

воскресенье, 21 ноября 2010 г.

Сборка и отладка плагинов для Qt Creator 2.1

Почти год назад я написал про создание и сборку плагинов для Qt Creator: часть 1 и часть 2. До третьей части руки не дошли- родилась дочка, на Creator пришлось почти полностью забить. Но сейчас появилось время поковыряться со своим плагином в последнем Creator'е, посмотреть на новые фичи. Оказалось, что написание новых плагинов теперь сильно оптимизировано- в Qt Creator 2.1 появился мастер создания плагина.

Для старых версий Qt Creator, в том числе и 2.0.1, см. пост "Пишем плагин для Qt Creator - часть 1". Этот пост актуален для Qt Creator 2.1.

Что нужно для сборки.

Я использовал библиотеку Qt 4.7.0 для MSVC. Библиотеку я не переконфигурировал. Я пробовал Qt 4.7.1, но с ней Qt Creator не линкуется.

Я собирал плагин в Qt Creator 2.1 beta 2. Также нужны его исходники, поскольку сгенерированный плагин не совместим со старыми версиями Creator'а.

Создаем новый плагин.

Во-первых, надо собрать дебаг билд Qt Creator из исходников. Используем shadow build:


Проект с построенным Qt Creator можно закрывать.

Во-вторых, создаем новый плагин. В качестве билд-директории будем использовать ту же билд директорию, что и для самого Qt Creator, иначе плагин не соберется. Директорию с исходниками плагина лучше создавать на том же уровне (параллельно) что и билд директория с исходниками Qt Creator, иначе Creator будет жаловаться, хотя и не фатально.







Что получили.

Мастер нового плагина сгенерировал файл проекта, в котором прописаны несколько вещей:
  • PROVIDER (определяет директорию, где появится плагин в lib\qtcreator\plugins, обычно это Nokia)
  • QTCREATOR_SOURCES (путь к исходникам Qt Creator)
  • IDE_BUILD_TREE (билд директория)
  • LIBS (путь к библиотекам)
и хорошо знакомые
  • TARGET (= DoNothing)
  • TEMPLATE (= lib)
  • SOURCES
  • HEADERS
  • OTHER_FILES
Также созданы файлы:
  • DoNothing.pluginspec
  • donothing.cpp
  • donothing.h
  • donothing_global.h
Я здесь содержимое этих файлов приводить не буду. Pluginspec не изменился. Сишник и хедер определяют минимальные методы плагина и реализуют новый пункт меню Tools.

Сборка.

В Build Settings плагина DoNothing указывем нужную билд-директорию.



Собираем плагин. Все должно получиться без ошибок или ворнингов.

Запускаем только что собранный Qt Creator (можно из самого Qt Creator, если не закрыли). Выбираем пункт меню Help->About Plugins... Находим в списке наш плагин:



Также, в меню Tools добавился пункт DoNothing->DoNothing action:


Что нужно для отладки.

Во-первых, проверяем Run Settings плагина: Run Configuration- запускать только что собранный Qt Creator, исполняемый файл- он же, Working directory- $BUILDDIR:



Во-вторых, открываем donothing.cpp и ставим где-нибудь точку останова. Например, но выходе из DoNothingImpl::initialize().

В-третьих, запускаем отладку плагина. Я получил сообщение, что нету дебаг хелперов. Жмем Continue Aniway. Qt Creator стартует и останавливается на нашем бряке:



среда, 27 октября 2010 г.

Qt Developer Network Wiki

Чем интересна эта вики? А тем, что она собирает вместе документацию по самойQt, Qt тулзам и адд-онам, Qt Quick и прочим модулям, и т.д. и т.п. Ну и конечно, есть инфа по Qt Creator. В частности- полезные плагины. Так что рекомендую.

воскресенье, 7 февраля 2010 г.

Еще плагины

Вот два плагина, которые могут пригодиться, хотя я их и не ставил.

Плагин для Doxygen: http://dev.kofee.org/QtCreator-Doxygen/.
Плагин для макросов: см. в master branch Qt Creator 1.3.80 или branch 1.3 для Qt Creator 1.3.1 в http://gitorious.org/creator-plugins.

вторник, 26 января 2010 г.

Class View для Qt Creator



Называется этот плагин CppSupport, сделал его некий VisualFC сотоварищи. Плагин поддерживает Qt Creator 1.3.0 и 1.3.1. Исходники и собранная дллька под Windows живут здесь. Установка простая- открываем архив для нужной версии креатора и копируем директорию win32-plugin со всем ее содержимым в \qtcreator\plugins.

Плагин этот немного сыроват. Я загрузил qtcreator.pro, открыл проект gitplugin, немного потыкался в Class View, и Qt Creator вылетел почти сразу. А в мелком проекте CppSupport работает ничего себе.

Под линукс я его пока не собирал.

UPD: Class View от Дениса Мингулова входит в состав Qt Creator 2.1. Доступен во второй бете, работает как часы.

суббота, 26 декабря 2009 г.

Пишем плагин для Qt Creator - часть 2

Этот пост- продолжение серии про написание плагинов для Qt Creator. Начало, про минимальный рабочий плагин, см. здесь. В этой части речь пойдет про то, как привязаться к меню Qt Creator.

Для подготовки этого поста я, как и раньше, использовал доку от VCreate Logic, только в этот раз материал переработан в гораздо большей степени.

Работа с меню

Нам нужно уметь делать несколько вещей:
  • добавлять пункт меню в сушествующее меню Qt Creator (например, Help)
  • добавлять меню в менюбар Qt Creator
  • добавлять пункт меню в новое меню
  • регистрировать новые меню и пункты меню
  • обрабатывать вызов меню и пункта меню
Для демонстрации возьмем плагин DoNothing, который мы начали создавать в части 1 этой серии. Меню и пункты меню будем создавать в методе DoNothing::initialize(), поскольку это часть инициализации плагина. Сначала создадим пункт меню About DoNothing в меню Help, перед пунктом About Plugins, затем создадим новое меню DoNothing c единственным пунктом About DoNothing:


bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
{
    // The 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.

    Q_UNUSED(args);
    Q_UNUSED(errMsg);

    createMenuItems();
    createMenus();

    // Return true signifying that the initialization was successful.
    // If the initialization was unsuccessful (for some wired reason); the errMsg string should be set to a human readable error message.
    return true;
}


Вся работа с меню строится на использовании классов QMenu, QMenuBar, QAction, и нескольких классов Core:
  • Core::ActionManager
  • Core::ActionContainer
  • Core::Command

ActionManager отвечает за регистрацию меню, пунктов меню и горячих клавиш.

ActionContainer представляет собой меню или менюбар. Экземпляры ActionContainer никогда не создаются напрямую, только с помощью ActionManager::createMenu(), ActionManager::createMenuBar(). Получить существующее меню можно через ActionManger, используя константы Core::Constants (M_FILE, M_FILE_NEW,... M_HELP).

Core::Command представляет такие действия как выбор пункта меню, нажатие кнопки или горячей клавиши. Экземпляры Core::Command также не создаются напрямую, вместо этого используются вызовы ActionManager::registerAction() для регистрации действия и получения команды. Объект Command представляет видимое для пользователя действие и его свойства.

Еще два слова об ActionManager::registerAction(). Этот метод регистрирует наши новые меню и пункты меню в ActionManager. Что, помимо прочих вещей, позволяет определять горячие клавиши на них (см. Tools->Options->Environment->Keyboard).



Поскольку все пункты меню являются QAction, их сигналы triggered(bool) или toggled(bool) связываются с нашим обработчиком посредством connect(). Подробности см. в коде.

Далее мы рассмотрим два метода- CreateMenuItems() и CreateMenus(). Полностью код плагина приведен в конце поста.


Добавляем пункт меню в сушествующее меню Qt Creator

Добавить пункт меню можно как в начало меню, так и в середину. Добиться первого можно с помощью вызова метода Core::ActionContainer::addAction(), а второго- с помощью вызова метода QMenu::insertAction().

insertAction() в качестве первого параметра получает пункт уже существующего меню (указатель на QAction), перед которым надо добавить новый пункт меню. Ну а новый пункт меню (опять же указатель на QAction) передается во втором параметре.

Приведенный внизу код содержит оба метода. Мы добавим два новых пункта в меню Help- About DoNothing и About DoNothing 2:




void DoNothingPlugin::createMenuItems()
{
    // Fetch the action manager
    Core::ActionManager* am = Core::ICore::instance()->actionManager();

    // Create a command for "About DoNothing"
    Core::Command* cmd = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothingItem", QList<int>() << Core::Constants::C_GLOBAL_ID);
    cmd->action()->setText("About DoNothing");

    // Add the command "Do Nothing" in the beginning of Help menu
    am->actionContainer(Core::Constants::M_HELP)->addAction(cmd);

    // Since menu-items are QActions, we can connect to their triggered(bool) or
    // toggled(bool) signal and respond to trigger/toggled events
    connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(about()));

    // Create a command for "About DoNothing 2"
    Core::Command* cmd2 = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothing2Item", QList<int>() << Core::Constants::C_GLOBAL_ID);
    cmd2->action()->setText("About DoNothing 2");

    // Insert the "DoNothing 2" item before "About Plugins..."
    QMenu* helpMenu = am->actionContainer(Core::Constants::M_HELP)->menu();
    QAction* aboutPluginsAction = am->command(Core::Constants::ABOUT_PLUGINS)->action();
    helpMenu->insertAction(aboutPluginsAction, cmd2->action());

    // Connect the action
    connect(cmd2->action(), SIGNAL(triggered(bool)), this, SLOT(about()));
}



Добавляем новое меню в Qt Creator

Новое меню можно добававить либо в начало менюбара, либо где-нибудь в середину. Аналогично с пунктом меню, существуют методы Core::ActionContainer::addMenu() и QMenuBar::insertMenu().

isertMenu(), как и insertAction(), в качестве первого параметра получает указатель на QActon, который является меню, перед которым надо добавить наше новое меню. Как и раньше, указатель на новое передается во втором параметре.

Мы создадим два меню- в самом начале менюбара и перед меню Help:




void DoNothingPlugin::createMenus()
{
    // Fetch the action manager
    Core::ActionManager* am = Core::ICore::instance()->actionManager();

    // Create a DoNothing menu
    Core::ActionContainer* ac = am->createMenu("DoNothingPlugin.DoNothingMenu");
    ac->menu()->setTitle(tr("DoNothing"));

    // Create a command for "About DoNothing".
    Core::Command* cmd = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothing", QList<int>() << 0);
    cmd->action()->setText("About DoNothing");

    // Add DoNothing menu to the beginning of the menu bar
    am->actionContainer(Core::Constants::MENU_BAR)->addMenu(ac);

    // Add the "About DoNothing" action to the DoNothing menu
    ac->addAction(cmd);

    // Connect the action
    connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(about()));

    // Create a DoNothing2 menu
    Core::ActionContainer* ac2 = am->createMenu("DoNothingPlugin.DoNothing2Menu");
    ac2->menu()->setTitle(tr("DoNothing2"));

    // Create a command for "About DoNothing 2".
    Core::Command* cmd2 = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothing2", QList<int>() << 0);
    cmd2->action()->setText("About DoNothing 2");

    // Insert the "DoNothing" menu between "Window" and "Help".
    QMenu* helpMenu = am->actionContainer(Core::Constants::M_HELP)->menu();
    QMenuBar* menuBar = am->actionContainer(Core::Constants::MENU_BAR)->menuBar();
    menuBar->insertMenu(helpMenu->menuAction(), ac2->menu());

    // Add the "About DoNothing 2" action to the DoNothing2 menu
    ac2->addAction(cmd2);

    // Connect the action
    connect(cmd2->action(), SIGNAL(triggered(bool)), this, SLOT(about()));
}



Код плагина

donothingplugin.h:


#ifndef DONOTHINGPLUGIN_H
#define DONOTHINGPLUGIN_H

#include <extensionsystem/iplugin.h>

class DoNothingPlugin : public ExtensionSystem::IPlugin
{
    Q_OBJECT

public:
    DoNothingPlugin();
    ~DoNothingPlugin();

    void extensionsInitialized();
    bool initialize(const QStringList & arguments, QString * errorString);
    void shutdown();

private:
    void createMenus();
    void createMenuItems();

private slots:
    void about();

};

#endif // DONOTHINGPLUGIN_H


donothingplugin.cpp


#include "donothingplugin.h"
#include <QtPlugin>
#include <QStringList>

#include <coreplugin/coreconstants.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/command.h>
#include <coreplugin/icore.h>
#include <QKeySequence>
#include <QtGui/QMessageBox>

DoNothingPlugin::DoNothingPlugin()
{
    // Do nothing
}

DoNothingPlugin::~DoNothingPlugin()
{
    // Do notning
}

bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
{
    // The 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.

    Q_UNUSED(args);
    Q_UNUSED(errMsg);

    createMenuItems();
    createMenus();

    // Return true signifying that the initialization was successful.
    // If the initialization was unsuccessful (for some wired reason); the errMsg string should be set to a human readable error message.
    return true;
}

void DoNothingPlugin::extensionsInitialized()
{
    // The 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.

    // Do nothing
}

void DoNothingPlugin::shutdown()
{
    //The shutdown() method is called when the plugin is about to be unloaded.

    // Do nothing
}

void DoNothingPlugin::createMenuItems()
{
    // Fetch the action manager
    Core::ActionManager* am = Core::ICore::instance()->actionManager();

    // Create a command for "About DoNothing"
    Core::Command* cmd = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothingItem", QList<int>() << Core::Constants::C_GLOBAL_ID);
    cmd->action()->setText("About DoNothing");

    // Add the command "Do Nothing" in the beginning of Help menu
    am->actionContainer(Core::Constants::M_HELP)->addAction(cmd);

    // Since menu-items are QActions, we can connect to their triggered(bool) or
    // toggled(bool) signal and respond to trigger/toggled events
    connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(about()));

    // Create a command for "About DoNothing 2"
    Core::Command* cmd2 = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothing2Item", QList<int>() << Core::Constants::C_GLOBAL_ID);
    cmd2->action()->setText("About DoNothing 2");

    // Insert the "DoNothing 2" item before "About Plugins..."
    QMenu* helpMenu = am->actionContainer(Core::Constants::M_HELP)->menu();
    QAction* aboutPluginsAction = am->command(Core::Constants::ABOUT_PLUGINS)->action();
    helpMenu->insertAction(aboutPluginsAction, cmd2->action());

    // Connect the action
    connect(cmd2->action(), SIGNAL(triggered(bool)), this, SLOT(about()));
}

void DoNothingPlugin::createMenus()
{
    // Fetch the action manager
    Core::ActionManager* am = Core::ICore::instance()->actionManager();

    // Create a DoNothing menu
    Core::ActionContainer* ac = am->createMenu("DoNothingPlugin.DoNothingMenu");
    ac->menu()->setTitle(tr("DoNothing"));

    // Create a command for "About DoNothing".
    Core::Command* cmd = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothing", QList<int>() << 0);
    cmd->action()->setText("About DoNothing");

    // Add DoNothing menu to the beginning of the menu bar
    am->actionContainer(Core::Constants::MENU_BAR)->addMenu(ac);

    // Add the "About DoNothing" action to the DoNothing menu
    ac->addAction(cmd);

    // Connect the action
    connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(about()));

    // Create a DoNothing2 menu
    Core::ActionContainer* ac2 = am->createMenu("DoNothingPlugin.DoNothing2Menu");
    ac2->menu()->setTitle(tr("DoNothing2"));

    // Create a command for "About DoNothing 2".
    Core::Command* cmd2 = am->registerAction(new QAction(this), "DoNothingPlugin.AboutDoNothing2", QList<int>() << 0);
    cmd2->action()->setText("About DoNothing 2");

    // Insert the "DoNothing" menu between "Window" and "Help".
    QMenu* helpMenu = am->actionContainer(Core::Constants::M_HELP)->menu();
    QMenuBar* menuBar = am->actionContainer(Core::Constants::MENU_BAR)->menuBar();
    menuBar->insertMenu(helpMenu->menuAction(), ac2->menu());

    // Add the "About DoNothing 2" action to the DoNothing2 menu
    ac2->addAction(cmd2);

    // Connect the action
    connect(cmd2->action(), SIGNAL(triggered(bool)), this, SLOT(about()));
}

void DoNothingPlugin::about()
{
    QMessageBox::information(0, "About DoNothing Plugin", "Seriously dude, this plugin does nothing", QMessageBox::Ok);
}

// export the plugin class
Q_EXPORT_PLUGIN(DoNothingPlugin)



воскресенье, 13 декабря 2009 г.

Пишем плагин для Qt Creator - часть 1

Я тут нарыл неплохой документ по созданию плагинов с нуля. Он сильно экономит время- не надо лазить по хелпу и рыться в исходниках, пытаясь понять, с чего начать. Сразу скажу, что переводить эту доку на русский дословно я здесь не буду. Вместо этого кратко изложу, как я делал этот минимальный плагин, используя доку от VCreate Logic. Итак, часть 1-я.


Минимальный плагин

Этот плагин ничего полезного делать не будет, поэтому называется он DoNothing. Цель его создания- получить скелет, на который потом можно нарастить мясо. Вместе с тем, плагин должен успешно определяться по команде Help->About Plugins...

Что надо сделать:
  1. Скачать исходный код Qt Creator 1.3.
  2. Создать директорию для нового плагина.
  3. Создать файл проекта.
  4. Создать файл спецификации плагина.
  5. Создать файлы с исходным кодом.
  6. Собрать плагин и загрузить.

1. Исходный код Qt Creator 1.3

Скачиваем исходный код Qt Creator 1.3.0 и распаковываем, например, сюда: d:\Projects\qt-creator-1.3.0\.


2. Директория плагина

Директорию для исходников надо создать там же, где лежат исходники для остальных плагинов: d:\Projects\qt-creator-1.3.0\src\plugins\donothing

Далее все файлы будем создавать в этой директории. Соглашение об именах- я использую типичные для Qt Creator имена файлов и директорий. Регистр написания имен так же традиционен.


3. Файл проекта

Файл проекта назовем donothing.pro. Вот его содержимое:

TEMPLATE = lib
TARGET = DoNothing

include(../../qtcreatorplugin.pri)
include(../../plugins/coreplugin/coreplugin.pri)

HEADERS += donothingplugin.h
SOURCES += donothingplugin.cpp
OTHER_FILES += DoNothing.pluginspec

Этот файл:
  • говорит, что выходом будет библиотека (DoNothing.dll на Windows)
  • заставляет DoNothing читать установки из qtcreatorplugin.pri и coreplugin.pri
  • указывает .cpp и .h файлы с кодом плагина
  • добавляет в проект спецификацию плагина (не обязательно, но удобно)
Нам еще надо добавить наш плагин в проект всех плагинов. Добавляем вот эти строки в конец файла d:\Projects\qt-creator-1.3.0\src\plugins\plugins.pro:

SUBDIRS += plugin_DoNothing
plugin_DoNothing.subdir = donothing


4. Файл спецификации плагина

Файл спецификации назовем DoNothing.pluginspec. Туда надо записать:

<plugin name="DoNothing" version="0.0.1" compatVersion="1.3.0">
  <vendor>VCreate Logic Pvt. Ltd.</vendor>
  <copyright>(C) 2008-2009 VCreate Logic Pvt. Ltd.</copyright>
  <license>Do anything you want</license>
  <description>A plugin that does nothing</description>
  <url>http://www.vcreatelogic.com</url>
  <dependencyList>
    <dependency name="Core" version="1.3.0"/>
  </dependencyList>
</plugin>

Ключевых моментов тут два:
  • Необходимая версия Qt Creator- 1.3.0
  • Наш плагин зависит от плагина Core

5. Исходный код

Хедер файл назовем donothingplugin.h

Вот что в него надо записать:

#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

Наш плагин- это потомок IPlugin, который опрделяет интерфейс плагинов.

А вот и сишник (donothingplugin.cpp), который все объявленные методы и реализует:

#include "donothingplugin.h"
#include <QtPlugin>
#include <QStringList>

DoNothingPlugin::DoNothingPlugin()
{
    // Do nothing
}

DoNothingPlugin::~DoNothingPlugin()
{
    // Do notning
}

bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)
{
    // The 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.

    Q_UNUSED(args);
    Q_UNUSED(errMsg);

    // Since our plugin really does nothing, we return true signifying that the initialization was successful. If the initialization was unsuccessful (for some wired reason); the errMsg string should be set to a human readable error message.

    return true;
}

void DoNothingPlugin::extensionsInitialized()
{
    // The 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.

    // Do nothing
}

void DoNothingPlugin::shutdown()
{
    //The shutdown() method is called when the plugin is about to be unloaded.

    // Do nothing
}

// export the plugin class
Q_EXPORT_PLUGIN(DoNothingPlugin)

Комментарии в методах объясняют, для чего, собственно, эти методы нужны и когда они вызываются.


6. Сборка и использование плагина

Я собирал под Qt Creator 1.3. SDK можно взять здесь. Для Wiindows надо скачать сборку Qt 4.6 для MSVC.

Открываем наш плагин donothing.pro- File->Open File or Project. Build->Set Build Configuration: Release. И делаем Ctrl-B.

Если что не собирается, вот здесь я написал как собирать плагины для Qt Creator.

Копируем DoNothing.dll (libDoNothing.so в Linux) и DoNothing.pluginspec из d:\Projects\qt-creator-1.3.0\lib\qtcreator\plugins\Nokia\ в ту же директорию Nokia, но в Qt Creator 1.3.0. Перезапускаем Qt Creator.

По команде Help->About Plugins... видим наш новый плагин: