Программирование в Qt: создаем виджет в стиле HUD

Другие статьи по Qt 4.x

Под влиянием новых интерфейсов GNOME я решил сделать виджет для Qt – меню с поисковой строкой в верхней части. В остальной части меню отображаются команды приложения, в наименование которых входит текст, введенный в строке. Такое меню может быть полезно для пользователей, которые помнят, как называется команда, но не помнят, в каком разделе главного меню он находится, или не хотят «ползать» по бесконечным выпадающим под-меню. Этот виджет можно расматривать как дополнение к примерам нестандартных виджетов, описанных в моей книге.

Начнем с задачи добавления виджета в меню. Многие не знают, как это сделать и на форумах Qt можно встретить советы по созданию странных меню-образных конструкций на основе QFrame. На самом деле добавить виджет в меню очень просто. Начиная с версии 4.2, то есть, с незапамятных времен, в Qt есть класс QWidgetAction. Этот класс используется методом addWidget() класса QToolBar для добавления виджетов на панель быстрого доступа. У класса QMenu нет метода addWidget(), но это не мешает нам воспользоваться объектом класса QWidgetAction для добавления виджета в QMenu:

QMenu * menu;
QLineEdit * lineEdit;
...
QWidgetAction * wa = new QWidgetAction();
wa->setDefaultWidget(lineEdit);
menu->addAction(wa);

Вторая задача, которую нужно решить – получение списка команд приложения для поиска и отображения в меню. Разумные люди создают для каждой команды объект QAction, и если вы поступаете так же, то эта задача легко решаема. Где искать эти объекты QAction? У класса QWidget и всех его потомков есть коллекция actions(), которая позволяет связать виджет с определенным набором объектов QAction. Но виджеты типа QMainWindow по умолчанию не используют коллекцию actions() для хранения добавленных программистом команд. Коллекция actions() используется, например, для заполнения контекстного меню виджета, а вы вряд ли захотите, чтобы все добавленные вами команды отображались в контекстном меню главного окна. Допустим, что вы создавали объекты QAction для команд в программе Qt Creator. В этом случае объекты QAction будут дочерними объектами объекта QMainWindow, точно так же, как виджеты, расположенные в главном окне. Соответственно для поиска объектов QAction можно воспользоваться стандартным средством поиска объектов определенного класса:

QList<QAction *>  al = findChildren<QAction *>();

Это – почти все, что нам требуется для решения задачи поиска команд приложения по их именам. Единственное, на что осталось обратить внимание, это на то, что в список объектов QAction, построенный описанным выше образом попадут специальные объекты, созданные для отображения главного меню программы (если в программе, конечно, есть главное меню). Отображать эти служебные объекты QAction в меню результатов поиска нецелесообразно, но и К выделить такие объекты из общего списка легко – для них метод menu() возвращает ненулевой указатель. Вот теперь действительно все. Описанный способ поиска команд приложения реализует виджет QxtActionSearch, который показан на скриншоте, и который можно найти в архиве исходных текстов в составе демонстрационной программы. Сама программа содержит меню с множеством команд, которые ничего не делают. Они предназначены исключительно для демонстрации работы механизма поиска.

Текст виджета и демки

Понравилась статья? Нажми:


© 2012  Андрей Боровский <anb@symmetrica.net>

Вернуться на страницу серии На главную