Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216

QAction и горячие клавиши

05.04.2017, 23:05. Показов 2580. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тоже проблема с какшонами.

Создаю QAction в креаторе, вешаю горячую клавишу, подключаю через QMenu:

datatablecommonwidgetclass.h
C++ (Qt)
1
2
3
4
5
6
7
8
class DataTableCommonWidgetClass : public QWidget
{
    Q_OBJECT
public:
    QMenu *menu;
private slots:
    void ShowContextMenu (QPoint pos);
}

datatablecommonwidgetclass.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DataTableCommonWidgetClass::DataTableCommonWidgetClass(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DataTableCommonWidgetClass)
{
    ui->setupUi(this);
 
    menu = new QMenu;
    this->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT (ShowContextMenu(QPoint)));
}
 
void DataTableCommonWidgetClass::ShowContextMenu (QPoint pos)
{
    QPoint globalPos;
    if (sender()->inherits("QAbstractScrollArea"))
        globalPos = ((QAbstractScrollArea *) sender())->viewport()->mapToGlobal(pos);
    else
        globalPos = ((QWidget *) sender())->mapToGlobal(pos);
 
    menu->addAction(ui->actAddFiles);
    menu->addAction(ui->actRemoveSelected);
    menu->exec(globalPos);
}
Соответствующие экшонам слоты, коннекты и прочую требуху опустил. Проблема в том, что в этом случае перестали работать горячие клавиши, заданные в компоновщике. Понимаю, что если подключить QAction непосредственно к классу окна, клавиши заработают, но мне требуется реализовать именно через QMenu. Конечно, можно переопределить keyPressEvent, но как-то оно криво, и задавать одно и то же свойство сразу в двух местах не очень бы хотелось. Не силен в этих процессах-ивентах, но предполагаю, что проблема в том, что нажатие клавиши в этом случае обрабатывается где-то в menu->keyPressEvent(QKeyEvent *event), а на деле ему как-то нужно попасть в keyPressEvent моего виджета, но как это реализовать - не знаю.

Гугление выдало три аналогичных темы, две из которых были как раз с этого форума, но решения проблемы я в них не нашел.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2017, 23:05
Ответы с готовыми решениями:

Горячие клавиши в Qt или QAction без QMenu
Всем доброго время суток! Стоит передо мной следующая задача: надо повесить появление диалога на сочетание клавиш (Ctrl+O). В принципе...

горячие клавиши
Как сделать в qt ?

Горячие клавиши Qt
Есть контекстное меню menu = new QMenu(this); ...

6
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
06.04.2017, 08:42
Попробуйте пырнуть Qt::ApplicationShortcut
1
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
06.04.2017, 09:09
Лучший ответ Сообщение было отмечено Anvis как решение

Решение

Цитата Сообщение от Anvis Посмотреть сообщение
Понимаю, что если подключить QAction непосредственно к классу окна, клавиши заработают
Так подключайте. Не забывайте, что QAсtion можно использовать сразу в нескольких местах. То есть создайте QActions отдельно, задав им нужный parent, при удалении которого они будут удалены. Затем внесите их в меню и в окно через addAction.

Добавлено через 6 минут
Кстати, если у виджета хотите отображать только принадлежащие виджету Actions и больше ничего, то можно у этого виджета в качестве ContextMenuPolicy выставить Qt::ActionsContextMenu. В таком случае контекстное меню у виджета будет создаваться автоматически из принадлежащего ему списка QActions.
http://doc.qt.io/qt-5/qt.html#... olicy-enum
2
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
06.04.2017, 15:40  [ТС]
icpu
Попробовал ваш совет в первую очередь, но никаких изменений не увидел. Пробовал, например, в конструкторе, добавить:
ui->actRemoveSelected->setShortcutContext(Qt::ApplicationShort cut);
Насколько понял, этот метод устанавливает, какая область интерфейса будут реагировать на горячие клавиши контекстного меню. Но опять же, вышенаписанная фраза почему-то не помогла. Вывод - проблема находится перед экраном .

Wyn
Спасибо, похоже разобрался. Добавил в конструктор убранные ранее фразы
C++ (Qt)
1
2
    this->addAction(ui->actRemoveSelected);
    this->addAction(ui->actAddFiles);
У виджета оставил Qt::CustomContextMenu и связь со слотом, в котором собираю и отображаю меню.
Родителя задавать не стал. В моем случае он, как понимаю, Ui, и задан автоматически.

Пошел через QMenu и Qt::CustomContextMenu, а не через Qt::ActionsContextMenu, так как хотел, чтобы действия этого виджета добавились к контекстному меню другого.

Спасибо, проблема решена.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
06.04.2017, 17:01
Цитата Сообщение от Anvis Посмотреть сообщение
Родителя задавать не стал. В моем случае он, как понимаю, Ui, и задан автоматически.
Как хочешь. В доках всё же рекомендуется:
We recommend that actions are created as children of the window they are used in. In most cases actions will be children of the application's main window.
1
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
07.04.2017, 18:12
Напишите пожалуйста вашу ОС...

В Линуксе - в "редакторе изоляции"
можно все так настроить, что все
коды прогаммы будут игнорится...
0
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
07.04.2017, 22:55  [ТС]
Цитата Сообщение от _SASA_ Посмотреть сообщение
Напишите пожалуйста вашу ОС...
В Линуксе - в "редакторе изоляции"
можно все так настроить, что все
коды прогаммы будут игнорится...
Линукс пока не интересует - все компьютеры, на которых будет запускаться программа - Windows XP и выше. В Линуксах и прочих платформах, если честно, совсем нуб, да и требование к кроссплатформенности маячит где-то там, на горизонте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2017, 22:55
Помогаю со студенческими работами здесь

Горячие клавиши в QT
Доброго времени суток. В общем такой вопрос. В программе я создаю горячею клавишу QShortcut *myShort = new...

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

MacBook: Горячие клавиши для выпада списка доступных методов и функций
Добрый день! Подскажите комбинацию клавиш на маковской клаве, с помощью которой выпадает в редакторе список доступных методов и функций? ...

Как для QWebView создать горячие клавиши для элементов навигации по tabindex?
Здравствуйте. Вобщем цель - навигация без мыши, но не через Tab. Диалоговое окно, в нём один QWebView. При загрузке страницы...

Проблема с QAction
Всем привет! Есть иконка в трее У неё есть меню m_ptrayIconMenu = new QMenu(this); Динамически создаём 2 итема ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru