Russian Qt Forum
Сентябрь 30, 2024, 10:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAction и вызов слота с параметром. Как сделать?  (Прочитано 12634 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Август 24, 2008, 22:25 »

Здравствуйте!


Мне нужно сделать таку вещь - создать контекстное меню (на виджете QListView) и вызывать один и тот же слот с разными параметрами. Ну то есть хотелось бы вместо создания отдельного слота на каждый пункт меню, иметь "общие" слоты, которые вызываются с параметром.

Ниже дан код (нерабочий), и хотелось бы понять, как сделать его рабочим.

Код:
  // Обычное добавление записи в конец списка
  a = new QAction(tr("Add new"), this);
  connect(a, SIGNAL(triggered()),
            this,SLOT(recordview_add_new_context(ADD_NEW_RECORD_TO_END)));
  menu.addAction(a);

  // Добавление записи до
  a = new QAction(tr("Add new before"), this);
  if((!recordview->selectionModel()->hasSelection()) ||
     (recordview->selectionModel()->selectedRows()).size()!=1 )
   a->setEnabled(false); // Пункт активен только если выбрана одна строка списка
  connect(a, SIGNAL(triggered()),
            this,SLOT(recordview_add_new_context(ADD_NEW_RECORD_BEFORE)));
  menu.addAction(a);
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #1 : Август 25, 2008, 00:17 »

читай документацию по QAction и QMenu
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Август 25, 2008, 05:26 »

типы параметров у слота и сигнала должны совпадать
Записан

Юра.
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Август 25, 2008, 15:43 »

читай документацию по QAction и QMenu

Спасибо за ответ! Он мне очень помог, теперь я точнее знаю, какие вещи в QT выше моего понимания!

Сделал по-простому, "один пункт меню"->"один слот".
Записан

Собираю информацию по крупицам
http://webhamster.ru
EhTemka
Гость
« Ответ #4 : Август 25, 2008, 17:28 »

Если будеш пользоваться QMenu или QActionGroup у них есть сигнал  void triggered ( QAction * action ), который соединяешь с одним слотом. А уже в слоте проверяешь, что за экшн передался такой  Подмигивающий

код примерно так будет выглядеть

Код:
QMenu *menu = new QMenu(this);
QAction *add = menu->addAction(tr("Add new"));
QAction *addBefor = menu->addAction(tr("Add new before"));

connect(menu , SIGNAL(triggered(QAction *)),
            this,SLOT(callAction(QAction *)));

Если пользуешся енамами можно добавить : add->setData(ADD_NEW_RECORD_TO_END) и т.д.
а уже в слоте проверять : if (action.data().toInt() == ADD_NEW_RECORD_TO_END) {...} и т.д.

Записан
mks56
Гость
« Ответ #5 : Сентябрь 02, 2008, 09:38 »

to xintrea

А по-моему, самое простое - создать единый слот БЕЗ ПАРАМЕТРА для всех нужных пунктов меню, присоединить к нему нужные АКЦИИ, а внутри слота проверять sender() на предмет совпадения с нужной АКЦИЕЙ.
Записан
ритт
Гость
« Ответ #6 : Сентябрь 02, 2008, 10:25 »

to mks56

тогда нужно хранить указатели на все акшены - чтобы было с чем сравнивать сендер()

представляю это самое простое - в декларировании класса прописывать сотню переменных Улыбающийся
Записан
zavulon
Гость
« Ответ #7 : Сентябрь 23, 2008, 18:56 »

Это классическая проблема. Есть два пути решения:

1. Уже предлагавшийся с проверкой объекта-отправителя: QObject::sender():
     http://doc.trolltech.com/4.4/qobject.html#sender
Совет: у отправителя можно проверять его имя или другие свойства, например QObject::objectName().

2. Более универсальный способ: использование посредника QSignalMapper:
     http://doc.trolltech.com/4.4/qsignalmapper.html
В документации есть хороший пример. Вот здесь действительно можно добавить к сигналу свой собственный параметр, причем совершенно любого типа. У каждого вызывающего объекта значение этого параметра будет своим.
« Последнее редактирование: Сентябрь 23, 2008, 18:58 от zavulon » Записан
ритт
Гость
« Ответ #8 : Сентябрь 23, 2008, 19:48 »

фактически сигналмаппер - это карта [сендер=>дата]. в зависимости от сендера будет испускаться сигнал с опр. дата. параметр не любого типа.

а вот у QAction есть сеттер/геттер data, который можно было бы получать из сендера!
Код:
QAction* action = qobject_cast<QAction*>(sender());
if(action)
    (void)action->data();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.