Контекстные меню в Qt


Визитной карточкой профессионального приложения является наличие контекстного меню. Контекстное меню — это меню, которое открывается при нажатии правой кнопки мыши. Для его реализации, также как и в случае всплывающего меню, используется класс QMenu. Отличие состоит лишь в том, что это меню не присоединяется к виджету QMenuBar.

Контекстное меню в программе на Qt

На рисунке показано окно программы и контекстное меню, отображаемое при нажатии правой кнопки мыши. В этом меню пользователь может выбрать одну из трех команд — Red (Красный), Green (Зеленый) или Blue (Синий), которые задают соответствующий цвет фона окна

#ifndef _ContextMenu_h_
#define _ContextMenu_h_

#include <QtGui>

class ContextMenu : public QTextEdit {
Q_OBJECT
private:
    QMenu* m_pmnu;

protected:
    virtual void contextMenuEvent(QContextMenuEvent* pe)
    {
        m_pmnu->exec(pe->globalPos());
    }

public:
    ContextMenu(QWidget* pwgt = 0)
       : QTextEdit(pwgt) 
    {
        setReadOnly(true);
        m_pmnu = new QMenu(this);
        m_pmnu->addAction("&Red");
        m_pmnu->addAction("&Green");
        m_pmnu->addAction("&Blue");
        connect(m_pmnu, 
                SIGNAL(triggered(QAction*)), 
                SLOT(slotActivated(QAction*))
               );
    }

public slots:
    void slotActivated(QAction* pAction)
    {
        QString strColor = pAction->text().remove("&");
        
        setHtml(QString("<BODY BGCOLOR=%1></BODY>").arg(strColor));
    }
};

#endif  //_ContextMenu_h_

В конструкторе класса ContextMenu создается виджет контекстного меню — указатель mpmnu. С помощью метода addAction() добавляются команды меню. Метод connect() соединяет сигнал меню triggered(QAction*) со слотом slotActivated(QAction*). Сигнал высылается каждый раз при выборе пользователем одной из команд меню. Этот слот получает указатель на объект действия. Благодаря тому, что наш класс ContextMenu унаследован от класса QTextEdit, мы можем устанавливать цвет фона при помощи строки в формате HTML — нужно только вызвать метод QTetxEdit::setHtml(). Сам цвет устанавливается в соответствии с именем выбранной команды, но без символа &, для чего вызывается метод QString::remove(). Строка с цветом записывается в переменную strColor.

Показ контекстного меню выполняется из метода обработки события контекстного меню QWidget::contextMenuEvent() и должен производиться на месте (координатах) указателя мыши, при нажатии правой кнопки. Для этого нужно передать в метод exec() значение объекта события контекстного меню, возвращаемое методом globalPos(). Этот метод возвращает объекты класса QPoint, содержащие координаты указателя мыши относительно верхнего левого угла экрана.

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

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

Читать далее: Создание диалоговых окон в Qt