Next Previous Table of Contents

### 5. Конфигурирование меню и панелей инструментов

Меню и панели инструментов - одна из наиболее важных частей приложения для обеспечения работы с документом. Как правило, вы должны сделать доступными все функции через меню. Те пункты меню, которые вызывают функции, недоступные в текущем состоянии приложения, должны быть запрещены.

Далее, приложение может содержать только одну панель меню, но несколько панелей инструментов.

Панель инструментов должна содержать только наиболее часто используемые функции, которые должны вызываться нажатием кнопок с иконками; также в состав панелей инструментов могут входить выпадающие списки для выбора значений.

### 5.1 Как они работают ?

Каждый вход меню или кнопка панели инструментов имеет ресурсный идентификатор (ID), представляющий собой число типа integer. Поскольку данные значения не могут использоваться дважды, они представляются макросами. В макросах числовое значение заменяется осмысленным названием, используемым в коде программы.

Все ресурсные ID собраны в файле `resource.h`, где можно посмотреть, какие числа уже задействованы. В любом случае, компилятор проинформирует вас, если вы дважды используете одно и то же число для различных входов. Кроме того, ресурсный файл должен содержать все клавиши быстрого доступа к меню, заменяемые в IDK-макросе(?). Например:

    (resource.h)

    #define ID_VIEW_TOOLBAR             12010

    (kscribble.cpp)

    // menu entry Toolbar in the "view" menubar menu
    view_menu->insertItem(i18n("&Toolbar"), ID_VIEW_TOOLBAR);

Этот код добавляет вход Toolbar в меню View панели меню приложения kscribble. Имя ресурсного ID состоит из имени меню и имени входа, как видно. Амперсант, стоящий перед буквой, заставляет ее работать как горячую клавишу, а само имя входа передается с использованием макроса интернационализации i18n().

При активации входа меню вызывается конструкция switch функции commandCallback() с ID меню. Поэтому вы должны добавить соответствующее сравнение в конструкцию switch и функцию, которую необходимо выполнить при выборе данного входа меню:

        case ID_VIEW_TOOLBAR:
            slotViewToolBar();
            break;

Заметьте, что вы не обязаны использовать систему ID. Если не задан никакой ID, меню нумеруется автоматически. KDevelop использует систему ID для того, чтобы иметь возможность создать конструкции switch для выбора выполняемого слота при поступлении сигнала `activated()` для меню и `clicked()` для кнопок панели инструментов. Однако эта связь может быть реализована непосредственно, используя соответствующие методы классов меню и панели инструментов.

### 5.2 Добавление нового меню

Новое меню добавляется в приложение так:

1. добавьте указатель на новое меню в заголовке класса приложения (App-class);
2. вызовите конструктор `QPopupMenu` для указателя в `initMenuBar()` там, где должна появиться ваша панель меню в дальнейшем;
3. добавьте соответствующие пункты меню в выпадающие меню и установите их ресурсные ID в файле ресурсов;
4. добавьте связи меню с `commandCallback()` и `statusCallback()` в конце `initMenuBar()`;
5. добавьте методы, которые будут вызываться при выборе входов меню, в заголовки и файлы реализации;
6. добавьте конструкции switch для входов в `commandCallback()` и `statusCallback()`;

### 5.3 Использование кнопок панелей инструментов

Кнопки панелей инструментов могут быть добавлены аналогично входам меню, но с тем отличием, что используемый метод - `insertButton()`. Этот метод принимает в качестве аргументов иконку и всплывающую подсказку вместо текста меню.

Иконки, которые вы хотите использовать, загружаются с помощью `KIconLoader`. `KApplication` предоставляет макросы `ICON()` и `Icon()` для доступа к `KIconLoader` и загрузки иконок. Эти макросы получают в качестве параметра имя файла иконки для ее загрузки из файловой системы KDE, производя в ней поиск в определенном порядке (см. `KIconLoader` для уточнения этого порядка).

Библиотеки KDE также предоставляют набор кнопок для панелей инструментов, которые используются для выполнения стандартных действий. В случае, когда они не удовлетворяют ваших потребностей, вы должны самостоятельно нарисовать иконки. KDevelop поможет вам это сделать - выберите "New" из меню "File", затем выберите тип файла Pixmap. Обычно иконки для панели инструментов располагаются в поддиректории проекта "toolbar" и инсталлируются оттуда в специфичный для вашего приложения KDE каталог "toolbar".

### 5.4 Конфигурация строки статуса

Шаблон проекта KDevelop уже использует строку статуса, отображая в ней справку о назначении входов меню и кнопок панели инструментов. При добавлении входа меню также добавляйте справочное сообщение в метод `statusCallback()`.

`statusCallback()` использует метод `slotStatusHelpMsg()` для показа сообщения в строке статуса в течение 2 секунд. Когда выполняется команда, вы должны использовать метод `slotStatusMsg()` в начале выполнения со строкой, поясняющей, что приложение делает; перед окончанием операции вы должны установить сообщение в строке статуса "Ready.", вызывая тот же метод.

### 5.5 Конфигурация горячих клавиш

Очень профессиональная вещь, которую вы всегда должны добавлять в ваше приложение, - это горячие клавиши. Они обычно используются опытными пользователями, которые хотят работать с приложением быстро и готовы изучить горячие клавиши. Для них библиотека KDE предоставляет класс `KAccel`, который реализует горячие клавиши и обеспечивает доступ к стандартной глобальной конфигурации горячих клавиш.

По умолчанию, приложение, сгенерированное KDevelop, использует только стандартные горячие клавиши, такие как F1 для получения помощи, Ctrl+N для создания нового файла. Перед добавлением новой комбинации клавиш вы должны посмотреть, а не определена ли она уже.

Если ваше приложение содержит множество горячих клавиш, вы должны сделать их конфигурируемыми через меню Options; они могут совпадать с конфигурацией других приложений или использоваться только в вашем. Библиотека KDE предоставляет класс `KKeyChooser` для использования в многостраничном диалоге, тогда как `KKeyDialog` дает готовое диалоговое окно для конфигурации горячих клавиш.

Для более детальной информации см. следующие классы: `KAccel`(kdecore), `KKeyChooser`, `KKeyDialog` (kdeui).

Next Previous Table of Contents