Создание меню в Qt


Меню является важной и неотъемлемой частью практически любого приложения. Оно находится в верхней части главного окна приложения и представляет собой секцию для расположения большого количества команд, из которых пользователь может выбирать нужную. В приложениях используются меню четырех основных типов:

В библиотеке Qt меню реализуется классом QMenu. Этот класс определен в заголовочном файле QMenu. Основное назначение класса — это размещение команд в меню. Каждая команда представляет объект действия (класс QAction). Все действия и само меню могут быть соединены со слотами для исполнения соответствующего кода при выборе команды пользователем.

Например, если пользователь выделил команду меню, то и меню, и объекты действий высылают сигнал hovered(), и если вам потребуется произвести в этот момент какие-либо действия, то их нужно соединить с соответствующим слотом.

Анатомия меню. Классы QMenu и QMenuBar

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

Меню в программе на Qt

"Горячие" клавиши информируют пользователя о комбинации клавиш, с помощью которой выполняется то же действие, что и при выборе соответствующей команды меню. Например, для отображения окна About Qt (О Qt), в примере, показанном на рисунке, используется комбинация клавиш <Ctrl>+<Q>. Старайтесь использовать стандартные комбинации для "горячих" клавиш.

По возможности, для всех пунктов меню должны быть определены клавиши быстрого вызова. Это позволит пользователю выбирать команды не только при помощи мыши, но и при помощи клавиатуры, нажав подчеркнутую букву (в названии команды) совместно с клавишей <Alt>. Например, для выбора команды Exit (Выход) нужно нажать <Alt>+<E>. Основные отличия подобного рода комбинаций для быстрого вызова от "горячих" клавиш состоят в следующем:

  • такие комбинации состоят из буквенной клавиши и клавиши <Alt>; 
  • они встречаются не только в меню, но и в диалоговых окнах; 
  • они представляют собой контекстное исполнение команд. Например, чтобы вызвать диалоговое окно About Qt (О Qt) нужно открыть меню Menu (Меню) комбинацией <Alt>+<M>, а затем нажать <Alt>+<A>. 

Стрелка у команды SubMenu (Подменю) говорит о том, что при выборе этой команды появится вложенное подменю, в нашем случае — Test (Тест). Вложенное подменю удобно для того, чтобы разгрузить меню, если оно содержит большое количество команд. Для удобства и понимания программы рекомендуется, чтобы степень вложенностей не превышала двух уровней.

Разделитель — это черта, которая отделяет одну группу команд от другой.

Команда с флажком используется для предоставления пользователю информации о режиме работы приложения и сигнализирует об активированной команде меню.

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

Иногда встречаются команды, которые нельзя исполнить в определенный момент времени. В таких случаях приложение должно делать такие команды недоступными, то есть делать их выбор невозможным. Недоступные команды меню отображаются другим, как правило — серым, цветом.

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

В следующем коде Qt реализуется меню, показанное на рисунке выше:

#include <QtGui>
#include "img4.xpm"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QMenuBar mnuBar;
    QMenu*   pmnu   = new QMenu("&Menu");

    pmnu->addAction("&About Qt", 
                    &app, 
                    SLOT(aboutQt()), 
                    Qt::CTRL + Qt::Key_Q
                   );

    pmnu->addSeparator();

    QAction* pCheckableAction = pmnu->addAction("&CheckableItem");
    pCheckableAction->setCheckable(true);
    pCheckableAction->setChecked(true);

    pmnu->addAction(QPixmap(img4_xpm), "&IconItem");

    QMenu* pmnuSubMenu = new QMenu("&SubMenu", pmnu);
    pmnu->addMenu(pmnuSubMenu);
    pmnuSubMenu->addAction("&Test");

    QAction* pDisabledAction = pmnu->addAction("&DisabledItem");
    pDisabledAction->setEnabled(false);

    pmnu->addSeparator();

    pmnu->addAction("&Exit", &app, SLOT(quit()));

    mnuBar.addMenu(pmnu);
    mnuBar.show();

    return app.exec();
}

Чтобы создать полноценное меню, потребуется к каждой команде меню верхнего уровня присоединить соответствующее всплывающее меню. За всплывающие меню отвечает класс QMenu. Итак, для создания меню необходимо иметь виджет класса QMenuBar — указатель pmnuBar и, по меньшей мере, один виджет класса QMenu — указатель pmnu.

Для добавления всплывающего меню к меню верхнего уровня нужно передать в метод addAction() название команды. Каждый метод addAction() возвращает указатель на объект действия QAction. Пользуясь этим указателем можно получить доступ к команде меню (pCheckableAction). Таким образом, вызов из объекта действия метода setCheckable() о предоставляет возможность установки флажка. Дальнейший вызов метода setChecked() устанавливает состояние флажка. В нашем примере в этот метод передается значение true, а это значит, что он будет находиться во "включенном" состоянии.

Метод addAction() принимает четыре параметра. Первый задает название команды меню, в котором можно указать букву для быстрого вызова, поставив перед ней символ &. Не упускайте из виду того, что команды меню не должны содержать одинаковых букв, используемых для быстрого вызова, ведь, в противном случае, одна из команд будет недоступна. Вторым параметром передается указатель на объект, содержащий слот, который вызывается при выборе этой команды. Сам слот передается третьим параметром. Последний параметр задает комбинацию для "горячей" клавиши. В нашем примере, для отображения диалогового окна AboutQt (О Qt) используется комбинация <Ctrl>+<Q>. Нажатие этой комбинации приведет к тому же действию, что и выбор соответствующей команды меню, а именно — будет вызван слот объекта приложения aboutQt().

Вызов метода addSeparator() добавляет разделитель в меню.

Указателем на объект действия (pDisableAction) можно воспользоваться также и для того, чтобы сделать некоторые из команд меню недоступными — с помощью метода setEnabled().

В метод addAction() первым параметром можно передавать объекты растровых изображений для установки пиктограммы действия команды.

Читать далее: Отрывные меню в Qt