Как сделать меню правой кнопки мыши в qt

Обновлено: 05.07.2024

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

  • Строка меню вверху окна приложения.
  • Всплывающее меню.
  • Отрывное меню, которое можно отделить от основного меню.
  • Контекстное меню.

В свою очередь меню может содержать разные разделы, например:

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

Класс QMenu

Основным виджетом для организации меню является класс QMenu. Для его использования необходимо подключить заголовочный файл QMenu . Один экземпляр класса QMenu соответствует одному возможному меню -- вертикальному списку из команд, разделителей, вложенных меню. Если главное меню приложения содержит несколько выпадающих вниз меню (например, "Файл", "Правка", "Настройка", "Помощь"), то для каждого из этих меню нужно создать собственный экземпляр класса QMenu .

При создании экземпляра класса QMenu ему можно указать в качестве параметра текстовую строку -- название меню. Например:

QMenu * fileMenu = new QMenu("&Файл");
QMenu * helpMenu = new QMenu("&Помощь");

Буква для быстрого вызова этого пункта меню выделена символом амперсанда.

Для добавления в меню команд используется метод addAction. Обычная команда меню должна быть связана с каким-то слотом, который будет активирован при вызове этого пункта меню. Например:

У метода addAction три параметра: текстовая строка с названием пункта меню, указатель на объект, принимающий сигнал, описание слота этого объекта, принимающего сигнал. В данном случае мы подсоединили пункт меню к слоту close() главного окна приложения w .

В этом примере a -- объект класса QApplication .

Ещё одним параметром можно передать горячую клавишу, при нажатии на которую активируется команда меню. Например, так:

Для вставки разделителя между пунктами меню используется метод addSeparator() .

Для вставки вложенного меню используется метод addMenu(submenu) , параметр submenu -- указатель на вложенное меню.

Главное меню приложения -- виджет QMenuBar

Виджет QMenuBar используется для создания горизонтального меню из нескольких выпадающих вниз меню. Обычно используется в качестве главного меню приложения.

Для использования виджета необходимо подключить заголовочный файл QMenuBar .

Для создания главного меню приложение необходимо:

  1. Создать виджет QMenuBar .
  2. Добавить в него разные меню при помощи методов addMenu .
  3. Разместить виджет QMenuBar на главном окне приложения, вызвав метод setMenuBar для менеджера компоновки верхнего уровня данного окна.

QMenuBar * mainMenu = new QMenuBar;
mainMenu->addMenu(fileMenu);
mainMenu->addMenu(helpMenu);
QVBoxLayout * layout = new QVBoxLayout;
layout->setMenuBar(mainMenu);

Если же в качестве главного окна приложения используется класс QMainWindow , то разместить главное меню можно при помощи метода setMenuBar класса QMainWindow :


Россия

  • размер шрифта уменьшить размер шрифтаувеличить размер шрифта
  • Печать
  • Эл. почта
  • Станьте первым комментатором!

Обработка нажатий кнопок мыши - Виджеты (компоненты) в Qt5.

Сегодня мы добавим для виджета обработку нажатий кнопок мыши. Виджет будет реагировать на одиночный щелчок левой, правой и центральной кнопки и на движение колесика мыши. Так же мы проверим двойной щелчок мыши.

Обработку событий с помощью слотов и сигналов мы рассмотрим в следующей статье.

Добавление реакции на щелчок

В этой статье мы будем использовать проект из предыдущей статьи .

Допустим, нам нужно, чтобы по щелчку лампа меняла цвет, для этого она должна реагировать на события.

Добавим методы в класс виджета

Добавим реализацию методов

В консоли мы увидим:

Мы объявляем для метода:

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

Обратите внимание, в данный момент, виджет реагирует на нажатие вообще любой кнопки мыши! Давайте это исправим.

Изменим объявления методов

Внесем изменения в сами методы:

Теперь смена цвета будет происходить только по щелчку левой кнопкой мыши.

Зашивать в сам виджет функционал смены цвета по щелчку не самая лучшая идея. Но в рамках этой статьи мы остановимся именно на этом способе.

Меняем цвет лапочки с помощью колесика мышки

Добавим обработку движения колесика мыши.

Добавим метод для смены активного цвета:

Каждый раз когда мы вращаем колесико мы вычисляем количество градусов, на которое повернулось колесико и передаем это значение в метод setActiveColor(int count).

В методе сначала мы принудительно включаем лампочку, так как работаем с цветом включенной лампочки.

Затем создаем экземпляр класса QColor из текущего цвета включенной лампы.

Далее вычисляем новое значение яркости взяв текущее и прибавив к нему count/5

Для того, чтобы значение яркости не вышло за допустимые пределы мы проверяем граничные условия.

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

Двойной щелчок мыши

Обратите внимание, при двойном щелчке одновременно обрабатывается одиночный и двойной щелчок. Для виджета вы можете использовать либо одинарный, либо двойной щелчок!

Всплывающее меню Qt TableView, вызываемое правой кнопкой мыши

Контекстное меню TableView при щелчке правой кнопкой мыши


Что касается использования элементов управления TableView, я не буду здесь объяснять, просто поговорим об обращении, щелкните правой кнопкой мыши выбранную строку (называемый элемент), и появится всплывающее меню. Результат операции следующий:

Процесс реализации в основном включает следующие ключевые моменты:

1. Инициализируйте управляющую таблицу TableView.

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

  • point_time_model представляет модель, соответствующую элементу управления TableView:
  • инициализация:

среди них,ui-> Point_Time_tableView-> setContextMenuPolicy (Qt :: CustomContextMenu) ;! ! ! Вот в чем дело! ! !

2. Добавьте контекстное меню для таблицы управления TableView.

Во-первых, вам нужно создать меню и добавить в него варианты поведения. Код выглядит следующим образом:
.cpp файл

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

3. Слот и сигнальный механизм контекстного меню.

  • .h файл
  • В файле .cpp инициализируйте функцию подключения сигнала слота после кода на шаге 2:

(1) SIGNAL (customContextMenuRequested (QPoint)) в функции соединения является ответным сигналом QMenu.
(2) Функция слота в SLOT (slotContextMenu (QPoint))) должна быть реализована вами самостоятельно, код выглядит следующим образом:

Выше, когда вы щелкаете правой кнопкой мыши по строке, появляется меню.Какая операция ответа требуется для каждого соответствующего меню - это операция между последующими слотами и сигналами.

Судь проблемы такова: при появлении контекстного меню, если снова сделать клик правой кнопкой мыши на виджете (не попадая в это менб) - меню исчезает (это нормально), однако не появляется снова. Как минимум на Windows появление меню снова - нормальное поведение.

connect(ui.tableFans, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(OnContextMenu(QPoint)));



Судь проблемы такова: при появлении контекстного меню, если снова сделать клик правой кнопкой мыши на виджете (не попадая в это менб) - меню исчезает (это нормально), однако не появляется снова. Как минимум на Windows появление меню снова - нормальное поведение.


Проверил в редакторе Qt Creator'а (собран на Qt 4.8.2). Работает так, как ожидается. Т. е. по правому клику (при открытом меню) в другом месте виджета появляется снова в новом месте.

Flex Ferrum,

Легко воспроизводится в следущих примерах:

C:\qt\qtbase\examples\widgets\mainwindows\menus
C:\qt\qtbase\examples\widgets\mainwindows\application
C:\qt\qtbase\examples\widgets\mainwindows\dockwidgets

C:\qt\qtbase\examples\widgets\widgets\icons
C:\qt\qtbase\examples\widgets\widgets\shapedclock
C:\qt\qtbase\examples\widgets\widgets\windowflags

и во всех остальных, у которых есть контекстное меню

Читайте также: