С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
 Аватар для pb_dev
10 / 10 / 2
Регистрация: 28.11.2013
Сообщений: 63

QMenu, QAction

12.06.2014, 17:00. Показов 5395. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день товарищи.
Вопрос: можно ли как-то узнать индекс QAction'a нажатого в QMenu.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2014, 17:00
Ответы с готовыми решениями:

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

Использование объекта класса qmenu в качестве qaction
Есть меню - в нем 2 пункта: файл/открыть, сохранить, сохранить как. И настройки. В Designer'е классы стоят qmenu для файл и настройки и...

Не работает слот при нажатии на QAction из QMenu
Доброго времени суток. Проблема такая, имеется класс ToolBar унаследованный от QToolBar и класс PartToolBar также унаследованный от...

4
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.06.2014, 18:14
Стандартными путями вроде бы нет, но как вариант:
C++ (Qt)
1
2
3
4
5
6
7
8
9
int actionIndex(QMenu *menu, QAction *act)
{
   QList<QAction *> actionList = menu->actions();
    for (int i = 0; i < actionList.size(); ++i) {
        if (actionList.at(i) == act) 
            return i;
    } 
   return -1;
}
1
 Аватар для pb_dev
10 / 10 / 2
Регистрация: 28.11.2013
Сообщений: 63
12.06.2014, 19:43  [ТС]
Уууууу) Попробую детальнее описать проблему. У меня есть QMenuBar в котором есть QMenu:

C++
1
2
3
4
    HandbookMenu = ui->menuBar->addMenu(tr("&Справочники"));
    HandbookMenu->addAction(actionClients);
    HandbookMenu->addAction(actionTypeOfDevice);
    HandbookMenu->addAction(actionBroken);
Получается что для каждого этого Action'a свой слот:
C++
1
2
3
connect(actionClients, SIGNAL(triggered()), this, SLOT(Clients()));
connect(actionTypeOfDevice, SIGNAL(triggered()), this, SLOT(TypeOfDevice()));
connect(actionBroken, SIGNAL(triggered()), this, SLOT(Broken()));
И вот сам слот:
C++
1
2
3
4
5
6
7
8
9
10
void MainWindow::Clients() //справочник -> Клиенты
{
    HandBook *handbook = new HandBook("Client", 1);
 
    handbook->setAttribute(Qt::WA_DeleteOnClose, true);
    handbook->setAttribute(Qt::WA_ShowModal, true);
    handbook->setWindowTitle(tr("Клиенты"));
    handbook->setWindowIcon(QIcon(":/images/clients"));
    handbook->show();
}
Для остальных двух слотов код почти такой же как для Clients. Считаю не очень разумно делать 3 слота почти одинакового содержимого. Поэтому прийшла идея сделать 1. Задача: получить индекс нажатого Action'a и согласно нему формировать окно Handbook. Думал через сигнал triggered передать индекс, но не могу вдуплить что нужно переопределять, так-как у QAction'a triggered() без параметров.
Может у Вас есть получше идеи, бо у меня мозги уже ку-ку.
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
12.06.2014, 20:03
QAction'у можно задавать setProperty, а в слоте triggered() забирать указатель на объект:
C++ (Qt)
1
2
3
4
5
6
7
action->setProperty("test", 1);
 
// в слоте
QAction *action = qobject_cast<QAction *>(sender());
if (!action)
    return;
qDebug() << action->property("test");
Если у вас список с экшенов хранится в глобальных переменных, то можно в слоте сравнивать указатели, без property.
Как-то так:
C++ (Qt)
1
2
3
4
5
QAction *action = qobject_cast<QAction *>(sender());
if (!action)
    return;
if (action == actionClients) {
...
1
 Аватар для pb_dev
10 / 10 / 2
Регистрация: 28.11.2013
Сообщений: 63
12.06.2014, 21:23  [ТС]
Неплохое решение. Первый вариант конечно больше подходит под мою задачу, но это можно было сделать и проще)

C++
1
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(OnTriggered(QAction*)));
(А вот подумал, не безопаснее ли так указатель передавать)

За SetProperty большое данке, пригодится)

ПС: тема еще открыта, может еще у кого интересные идеи будут.

Добавлено через 17 минут
Второй вариант тоже неплох - чет я указатели сравнить не додумался) Спасибо, буду работать... но уже завтра))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2014, 21:23
Помогаю со студенческими работами здесь

Фокус в QMenu
Как установить фокус на определённый action в QMenu...или что нужно переопределить для этого? Жаль, что setActiveAction не устанавливает...

QMenu и QGroupBox
Собственно, как обернуть QMenu в QGroupBox?

Не работает QAction
Пытаюсь сделать кнопку выхода в меню: создал меню бар, экшн, добавил пункт меню в бар, а к пункту прицепил экшн. Экшн подключил таким...

Меню QMenu
Здравствуйте. Создаю меню в дизайнере. Но в некоторых из пунктов меню отсутствует выпадающее меню. Я хочу, чтобы на эти пункты можно было...

QPushButton+QMenu
Помогите пожалуйста. Сделал я кнопку прикрепив к ней меню menuButton = new QPushButton(this); menuButton -&gt;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru