Pull to refresh

Использование панели режимов QtCreator + 2 плагина

Reading time 6 min
Views 9.4K

В продолжение заметок по разработке плагинов для QtCreator в данной статье описывается способ размещения виджетов непосредственно в панели переключения режимов. При разрешении экрана 1920x1080 в ней остается over 373x70 пикселей свободного пространства, которое можно с пользой задействовать в своем плагине. В качестве примеров реализации приводится 2 новых плагина для QtCreator. Описания плагинов, ссылки на репозитории с исходным кодом и собранные для Windows и Linux бинарники для QtCreator 3.x.x прилагаются.

Описание Api


Прежде всего необходимо создать плагин (в диалоге File->New File or Project... выбрать тип проекта Libraries->Qt Creator Plugin). В диалоге создания проекта будет необходимо указать путь к исходникам QtCreator (которые вы получили из репозитория git) и директории с собранным QtCreator. Будем считать, что каркас плагина создан и перейдем к описанию Api для размещения виджетов. Под Api в данном случае будут пониматься методы, доступные для разработчика плагина (размещенные в public и не входящие в пространство имен (namespace) Internal).

Добавлять виджеты можно как во время инициализации плагина (в функции initialize), так и после инициализации всех плагинов, от которых он зависит (в функции extensionsInitialized).
Существует три возможности использования панели режимов: добавление виджетов (QWidget), добавление действий (QAction) и добавление режимов (производные IMode). Во всех случаях понадобится подключить заголовочный файл менеджера режимов:
#include <coreplugin/modemanager.h>

1. Добавление виджетов (QWidget)

Добавление виджета выполняется с помощью static-функции Core::ModeManager::addWidget(QWidget *widget).
Рассмотрим код, который добавляет простую надпись (QLabel) в панель. Для этого в реализации функции initialize плагина добавим следующий код:
//создаем виджет - контейнер для элементов
QWidget *container = new QWidget();
//создаем надпись
QLabel *info = new QLabel(QString::fromUtf8("hello habrahabr!"));
//задаем ей белый цвет текста, чтобы он контрастировал с темным фоном
info->setStyleSheet(QString::fromUtf8("QLabel {color: white; }"));
//создаем лейаут
QHBoxLayout *containerLayout = new QHBoxLayout();
//и добавляем в него надпись
containerLayout->addWidget(info);
//задаем для виджета-контейнера лейаут с надписью
container->setLayout(containerLayout);
//добавляем виджет-контейнер в панель
Core::ModeManager::addWidget(container);

Если запустить этот пример, то будет видно, как вмещая надпись целиком панель «растянулась» по ширине.

Для контроля над размерами будет полезно для QHBoxLayout самостоятельно определить отступы, расстояния между виджетами а также зафиксировать максимальный размер виджета-контейнера, тогда виджеты, расположенные в контейнере, «урежутся» под заданный размер и Вы сможете доработать их:
containerLayout->setContentsMargins(0,0,0,0);
containerLayout->setSpacing(0);
container->setMaximumWidth(70);


В приведенном выше коде отступы нулевые и виджет может занять максимально доступный размер (70). Если Вы измените отступы слева и справа, то значение максимальной ширины для виджета также необходимо уменьшить на величину суммы отступов слева и справа.

В высоту доступно все свободное пространство. Но при этом стоит учитывать, что если виджет начнет претендовать на пространство, занятое кнопками переключения режимов, то они потеснятся (при этом спрятав иконки, как показано на рисунке):

Об этом стоит помнить, если предполагается использование плагина на компьютере с относительно небольшим разрешением (например как у меня на ноутбуке: при разрешении 1366x768 без «урезания» еле вместилось 2 плагина, приведенных в конце статьи). Можно смоделировать эту ситуацию, установив большее минимальное значение высоты виджета-контейнера, например:
container->setMinimumHeight(600);

2. Добавление действий (QAction)

Добавление действий выполняется с помощью функции:
Core::ModeManager::addAction(QAction *action, int priority)

где action — это необходимое действие (созданное разработчиком), а priority определяет очередность размещения действий. Чем меньше значение, тем ниже будет расположена кнопка активизации действия среди прочих (Run, Start Debugging, Build Project)
В приведенном ниже примере создается действие (QAction), которое (для примера) будет запускать скрипт сборки инсталлятора (например NSIS):
QAction *buildInstallerAction = new QAction(this);
buildInstallerAction->setIcon(QIcon(QString::fromUtf8(":/icons/icons/nsis48x48.png")));
buildInstallerAction->setText(QString::fromUtf8("Build installer"));
Core::ModeManager::addAction(buildInstallerAction, 0);

Текст «Build installer» будет отображаться в ToolTip. Так как priority равен «0», то GUI-элемент вызова действия будет в самом низу, как показано на рисунке:

Изображения для QIcon следует использовать с размером 32x32 px, так как большие все равно будут ужаты до этого размера.
Примечание: если необходимо добавить множество действий, то возможно стоит подумать о добавлении QToolBar в QtCreator:
QMainWindow *mainWindow = qobject_cast<QMainWindow *> (Core::ICore::mainWindow());
QToolBar *toolbar = new QToolBar();
toolbar->addAction(action);
mainWindow->addToolBar(Qt::TopToolBarArea, toolbar);


Также действия можно добавить в область выбора проекта с помощью функции
Core::ModeManager::addProjectSelector(QAction *action);
но в связи с специфичностью назначения этой области (выбор текущего проекта и типа сборки) её использование в плагинах мне кажется не перспективным.

3. Создание нового режима

В настоящее время в QtCreator существует 7 режимов (от «Welcome» до «Help»). Если Вы захотите создать собственный режим, то для этого будет необходимо создать соответствующий класс, наследуя от Core::IMode, а затем добавить его в систему расширений:
ExtensionSystem::IPlugin::addObject(myMode); 

Создание нового режима (IMode) может понадобиться в том случае, если возможностей отображения информации в панели вывода (OutputPanel) недостаточно. Например если Вы решите создать UML-редактор, интегрированный в QtCreator. Данная тема достаточно объемна, поэтому не будем рассматривать ее в данной статье и перейдем непосредственно к плагинам.

Плагин отображения статистики пользователя Habrahabr



Предположим Вы написали статью и разместили ее на хабре. Разумно предположить, что Вас интересует, как её восприняло сообщество. Вариантов тут не много: либо ее будут положительно оценивать и, как результат, рейтинг будет расти, либо отрицательно — тогда рейтинг будет падать. Есть еще третий вариант, когда статья у пользователей Вызывает желание поставить минус в карму. В таком случае возможно стоит (пока не поздно) снять статью с публикации. Конечно можно написать скрипт и поставить его в cron на сервере, который будет мониторить эти показатели и, в случае появления минуса, отправлять SMS сообщение пользователю, но на мой взгляд это уже чересчур. Однако каждый раз, переключаясь с IDE на браузер только чтобы посмотреть статистику, разработчик тратит не только время, но и внимание. В таких ситуациях мне вспоминается фраза: «Если Вы повторяете какую-либо последовательность действий более 5 раз, то эту последовательность нужно автоматизировать». Так собственно и появилась идея небольшой автоматизации, которая позволит мониторить положение дел не отрываясь от программирования.

Разработанный плагин для заданного пользователя с определенной периодичностью (которая также задается в настройках в диапазоне от 1 до 60 минут) обращается к api сайта (http://habrahabr.ru/api/profile/username/), получает xml данные, парсит их и обновляет значения кармы и рейтинга. Настройки расположены на вкладке «Habrahabr» раздела «Environment».
Стоит отметить, что во время тестирования плагина было замечено, что значения, полученные через api, по актуальности могут отставать от данных на сайте.

Ссылки:

Плагин управления аудиопроигрывателем



Данный плагин предназначен для управления воспроизведением аудио не покидая среды разработки. В нем используется эмуляция нажатия мультимедийных клавиш (т.е. он управляет работающим аудиоплеером). После установки плагина в QtCreator появляется панель с тремя кнопками: переход к предыдущему треку, переключение между паузой и воспроизведением аудио и переход к следующему треку.

Плагин тестировался с аудиоплеерами Aimp, iTunes и Audacious.
Ссылки:


Для установки обоих плагинов содержимое архивов необходимо распаковать в директорию, где располагаются плагины:
для Windows обычно C:\Qt\Tools\QtCreator\lib\qtcreator\plugins.
для Lunux-based систем /home/username/Qt5.2.0/Tools/QtCreator/lib/qtcreator/plugins при установке Qt в директорию пользователя. Или (как вариант) /opt/Qt5.2.0/Tools/QtCreator/lib/qtcreator/plugins (устанавливалось на Ubuntu).

Заключение


Возможно у читателя появится идея интересного плагина (напишите пожалуйста о ней в комментарии или в личном сообщении автору). Используя описанный api можно, например, создать плагин, который будет отображать статус сборки на сервере
, или плагин, который будет отображать время, проведенное за программированием с момента запуска IDE и каждые N минут сигнализировать: «Вы работаете без перерыва уже N минут» (небольшие перерыВы полезны как для здоровья, так и для продуктивности). Последний плагин можно развить в систему сбора статистики работы над проектом, которая позволит проанализировать, сколько времени затрачено на разработку в целом и по каждому файлу (а возможно и классу/функции, благо api позволяет). Но это уже тема отдельной статьи.
Tags:
Hubs:
+23
Comments 9
Comments Comments 9

Articles