Создание меню в Qt с помощью QMenu
Меню является важной и неотъемлемой частью практически любого приложения. Оно находится в верхней части главного окна приложения и представляет собой секцию для расположения большого количества команд, из которых пользователь может выбирать нужную. В приложениях используются меню четырех основных типов:
меню верхнего уровня;
всплывающее меню;
отрывное меню, которое можно отделять от основного;
контекстное меню.
В библиотеке Qt меню реализуется классом QMenu. Этот класс определен в заголовочном файле QMenu. Основное назначение класса — это размещение команд в меню. Каждая команда представляет объект действия (класс QAction). Все действия и само меню могут быть соединены со слотами для исполнения соответствующего кода при выборе команды пользователем.
Например, если пользователь выделил команду меню, то и меню, и объекты действий высылают сигнал hovered(), и если вам потребуется произвести в этот момент какие-либо действия, то их нужно соединить с соответствующим слотом.
Анатомия меню. Классы QMenu и QMenuBar
Пользователю будет легче привыкнуть к работе с новой программой, если ее меню будет похоже на меню других программ. На рисунке показаны составляющие типичного меню.
«Горячие» клавиши информируют пользователя о комбинации клавиш, с помощью которой выполняется то же действие, что и при выборе соответствующей команды меню. Например, для отображения окна 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();
}
Для добавления всплывающего меню к меню верхнего уровня нужно передать в метод addAction() название команды. Каждый метод addAction() возвращает указатель на объект действия QAction. Пользуясь этим указателем можно получить доступ к команде меню (pCheckableAction). Таким образом, вызов из объекта действия метода setCheckable() о предоставляет возможность установки флажка. Дальнейший вызов метода setChecked() устанавливает состояние флажка. В нашем примере в этот метод передается значение true, а это значит, что он будет находиться во «включенном» состоянии.
Метод addAction() принимает четыре параметра. Первый задает название команды меню, в котором можно указать букву для быстрого вызова, поставив перед ней символ &. Не упускайте из виду того, что команды меню не должны содержать одинаковых букв, используемых для быстрого вызова, ведь, в противном случае, одна из команд будет недоступна. Вторым параметром передается указатель на объект, содержащий слот, который вызывается при выборе этой команды. Сам слот передается третьим параметром. Последний параметр задает комбинацию для «горячей» клавиши. В нашем примере, для отображения диалогового окна AboutQt (О Qt) используется комбинация <Ctrl>+<Q>. Нажатие этой комбинации приведет к тому же действию, что и выбор соответствующей команды меню, а именно — будет вызван слот объекта приложения aboutQt().
Вызов метода addSeparator() добавляет разделитель в меню.
Указателем на объект действия (pDisableAction) можно воспользоваться также и для того, чтобы сделать некоторые из команд меню недоступными — с помощью метода setEnabled().
В метод addAction() первым параметром можно передавать объекты растровых изображений для установки пиктограммы действия команды.
It’s not my first time to visit this web site, i am visiting this web
page dailly and take good data from here daily.
Hey! This is kind of off topic but I need some guidance from an established
blog. Is it tough to set up your own blog? I’m not very techincal but I can figure things out pretty fast.
I’m thinking about setting up my own but I’m not sure where to start.
Do you have any tips or suggestions? Appreciate it
Very difficult to start it… And usually you will not have thousands of visitors.
For start i can recommend free domain (you can find in the internet) + free web hosting + wordpress.
For me current website not first i created some of them (more 30) but usually it was not a rocket science…
Wonderful blog! I found it while browsing on Yahoo News.
Do you have any tips on how to get listed in Yahoo News?
I’ve been trying for a while but I never seem to get there!
Thank you
Hi! Do you know if can i make any plugins to help with Search Engine Optimization? I’m trying to get my blog to rank for some targeted keywords but I’m not seeing very good gains. If you know of any please share. Thank you!
Hi, QtCreator is not a good idea for plugins at least you can’t use it on your website.
The maximum that you can do is app to analyze statistics and UI for yourself.