воскресенье, 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... видим наш новый плагин:




4 комментария:

  1. А что делать, если Qt Creator не видит этот плагин?

    ОтветитьУдалить
    Ответы
    1. Вы собирали плагин с помощью MinGW? Просто библиотеки, собранные MinGW могут не подходить для сборки QtCreator (который собирается MSVS). У меня была такая проблема при сборке плагина для QtDesigner. Решил сборкой QtCreator с помощью MinGW.

      Удалить
    2. Qt надо собирать/скачивать для своей платформы и компилятора, так что я помнится собирал подо все, что угодно. Что касается MiniGW и MSVC- у них точно name mangling разный, так что линковать их вместе нечего и пытаться.

      Удалить
  2. Честно говоря- не знаю. Четыре года как не проверял. Попробою как-нибудь на досуге пересобрать, тогда отпишусь сюда.

    ОтветитьУдалить