Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QMenu, Определение нажатого пункта 
V
    Опции темы
Riviero
Дата 2.6.2016, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: нет
Всего: 3



Создаётся QMenu в стиле:
Пункт 1,
Пункт 2
....
Пункт Х.
Как определить на какой нажали. Или как передать параметр от Action(а)?
PM MAIL   Вверх
baldman88
Дата 2.6.2016, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Пункты в меню добавляются двумя способами:
1. Прямое добавление QAction;
2. Создание QAction при добавлении пункта в меню.
В первом случае Вы создаете QAction и соединяете его сигнал (triggered) с нужным слотом.
Во втором случае QMenu возвращает созданный QAction, сигналы которого также соединяются с нужными слотами.
Получилось сумбурно. Вот пример:
Код

QMenu nemu;
QAction* foo = new QAction("foo");
menu.addAction(foo);
QAction* bar = menu.addAction("bar");
connect(foo, SIGNAL(triggered()), this, SLOT(fooFunc()));
connect(bar, SIGNAL(triggered()), this, SLOT(barFunc()));

PM MAIL   Вверх
Riviero
Дата 2.6.2016, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: нет
Всего: 3



Цитата(baldman88 @  2.6.2016,  16:12 Найти цитируемый пост)
1. Прямое добавление QAction;
2. Создание QAction при добавлении пункта в меню.


А если мне заранее неизвестно, сколько будет пунктов в меню, как в таком случае быть?
PM MAIL   Вверх
baldman88
Дата 2.6.2016, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Цитата(Riviero @ 2.6.2016,  17:45)
Цитата(baldman88 @  2.6.2016,  16:12 Найти цитируемый пост)
1. Прямое добавление QAction;
2. Создание QAction при добавлении пункта в меню.


А если мне заранее неизвестно, сколько будет пунктов в меню, как в таком случае быть?

Лучше опишите более конкретно задачу. Чего Вы хотите добиться? А то как-то не очень понятно в чем именно проблема  smile 
PM MAIL   Вверх
ss
Дата 2.6.2016, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



Цитата

А если мне заранее неизвестно, сколько будет пунктов в меню, как в таком случае быть?


делаешь функцию добавления пункта 
напр.
Код


QAction * addItem(ЗНАЧЕНИЕ НУЖНЫХ ПАРАМЕТРОВ)
{
   QAction *result = menu->addAction("ЗНАЧЕНИЕ НУЖНЫХ ПАРАМЕТРОВ");
   connect(result, SIGNAL(triggered()), this, SLOT( ОБРАБОТЧИК) )
return result;
}


и используешь ее в коде, где нужно добавить очередной пункт
addItem(ЗНАЧЕНИЕ НУЖНЫХ ПАРАМЕТРОВ);


или (ООП)

можно переопределить QAction.  и в методе Event (или свой метод написать) написать свой обработчик
тогда после вызова QAction *a = menu.exec(x,y) получим ссылку на объект со своим обработчиком.


PM MAIL   Вверх
Riviero
Дата 7.6.2016, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: нет
Всего: 3



Цитата(baldman88 @  2.6.2016,  18:29 Найти цитируемый пост)
Лучше опишите более конкретно задачу. Чего Вы хотите добиться? А то как-то не очень понятно в чем именно проблема   


Пункты меню загружаются из БД, те мне надо знать в конечном итоге ID пункта меню, на который я нажал.

Код

   QAction *result = menu->addAction("ЗНАЧЕНИЕ НУЖНЫХ ПАРАМЕТРОВ");
   connect(result, SIGNAL(triggered()), this, SLOT( Вот тут должен быть слот, в который надо передать параметр (ы)) )


Это сообщение отредактировал(а) Riviero - 7.6.2016, 15:58
PM MAIL   Вверх
baldman88
Дата 7.6.2016, 16:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: нет
Всего: 7



Цитата(Riviero @ 7.6.2016,  15:57)
Цитата(baldman88 @  2.6.2016,  18:29 Найти цитируемый пост)
Лучше опишите более конкретно задачу. Чего Вы хотите добиться? А то как-то не очень понятно в чем именно проблема   


Пункты меню загружаются из БД, те мне надо знать в конечном итоге ID пункта меню, на который я нажал.

Код

   QAction *result = menu->addAction("ЗНАЧЕНИЕ НУЖНЫХ ПАРАМЕТРОВ");
   connect(result, SIGNAL(triggered()), this, SLOT( Вот тут должен быть слот, в который надо передать параметр (ы)) )

Это Вы что-то эдакое придумали ... Тогда можно попробовать сделать так:
Код

menu->addAction("ЗНАЧЕНИЕ НУЖНЫХ ПАРАМЕТРОВ");
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(someSlot(QAction*)));

В данном случае слот someSlot просто обертка, которая будет принимать в качестве параметра QAction, соответствующий нажатому пункту, и, исходя из "ЗНАЧЕНИЯ НУЖНЫХ ПАРАМЕТРОВ" (например text), вызывать соответствующую функцию. Что-то вроде:
Код

void MainWindow::someSlot(QAction* action)
{
    if (action->text() == "Do foo") {
        doFoo();
    } else if (action->text() == "Do bar") {
        doBar();
    }
}

PM MAIL   Вверх
Riviero
Дата 7.6.2016, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: нет
Всего: 3



Цитата(baldman88 @  7.6.2016,  16:22 Найти цитируемый пост)


void MainWindow::someSlot(QAction* action)
{
    if (action->text() == "Do foo") {
        doFoo();
    } else if (action->text() == "Do bar") {
        doBar();
    }
}

Спасибо, то что надо.
PM MAIL   Вверх
borisbn
Дата 8.6.2016, 19:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



У QAction, как и у любого QObject есть setProperty() и property().

Код
QAction *result = menu->addAction("Название пункта 1");
result->setProperty( "prop_name_1", int_value_1 );
result->setProperty( "prop_name_2", str_value_2 );
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(someSlot(QAction*)));

result = menu->addAction("Название пункта 2");
result->setProperty( "prop_name_1", int_value_3 );
result->setProperty( "prop_name_2", str_value_4 );
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(someSlot(QAction*)));

void MainWindow::someSlot(QAction* action)
{
    int int_value = action->property( "prop_name_1" ).toInt();
    QString str_value = action->property( "prop_name_2" ).toString();
    if ( условие с int_value ) {
        doFoo();
    } else if ( условие c str_value ) {
        doBar();
    }
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.