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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: actionTriggered(QAction * action ) много раз  (Прочитано 13058 раз)
mozgofil
Гость
« Ответ #15 : Июль 12, 2009, 09:54 »

mozgofil, докажи, что это баг
это не баг, Spectre уже цитировал документацию по этому поводу
Записан
mozgofil
Гость
« Ответ #16 : Июль 12, 2009, 10:06 »

При нажатии кнопочки тулбара посылается 1 сигнал QToolBar::actionTriggered(QAction*)
При нажатии пункта меню посылается 1 сигнал QMenu::triggered(QAction*)
При нажатии кнопочки тулбара, либо пункта меню, либо шортката соответствующего экшну посылается 1 сигнал QAction::triggered
--
А так как есть - сигнал просто опосредованно конектится к экшну

А чем не устраивает такой вариант, ведь action один, какая вообще разница каким путем он был вызван ?
Нажат шоркат, пункт меню или тулбар реакция одинаковая, это как раз преимущество экшенов, что бы не писать
много раз один код.
приведу пример :
Код
C++ (Qt)
 
QToolBar* ptb = new QToolBar("Sample ToolBar");
QMenu* pmFile = new QMenu("&File");
this->addToolBar(ptb);
menuBar()->addMenu(pmFile);
       QAction* actions[3]={.....};
       pmFile->addAction(actions[0]);/// 1 экшн в меню
       ptb->addAction(actions[1]);/// 1 экшн на тулбаре
///1 экшн и в меню и на тулбаре :
       pmFile->addAction(actions[2]);
       ptb->addAction(actions[2]);
 

Чтобы работали actions[0] и actions[1] нужно коннектить и к меню и к тулбару,
но в этом случае actions[2] будет сигналить 2 раза.

Записан
ритт
Гость
« Ответ #17 : Июль 12, 2009, 10:21 »

чушь. коннектить нужно к акшену или к акшенгрупу.
или я не понимаю сути проблемы...
Записан
f-r-o-s-t
Гость
« Ответ #18 : Июль 12, 2009, 10:54 »

приведу пример :
Код
C++ (Qt)
 
QToolBar* ptb = new QToolBar("Sample ToolBar");
QMenu* pmFile = new QMenu("&File");
this->addToolBar(ptb);
menuBar()->addMenu(pmFile);
       QAction* actions[3]={.....};
       pmFile->addAction(actions[0]);/// 1 экшн в меню
       ptb->addAction(actions[1]);/// 1 экшн на тулбаре
///1 экшн и в меню и на тулбаре :
       pmFile->addAction(actions[2]);
       ptb->addAction(actions[2]);
 

Чтобы работали actions[0] и actions[1] нужно коннектить и к меню и к тулбару,
но в этом случае actions[2] будет сигналить 2 раза.

action[0] & action[1] и так будут работать если приконнектить прямо к ним, а не к тулбару и.т.п.
Помоему просто автор плохо понимает зачем и как использовать actions.
Записан
spectre71
Гость
« Ответ #19 : Июль 12, 2009, 11:05 »

Вообще-то, в нормальном интерфейсе, в случае когда присутствует главное меню, все комманды(actions) на тулбарах, должны быть и в главном меню.
Записан
mozgofil
Гость
« Ответ #20 : Июль 12, 2009, 19:55 »

Вообще-то, в нормальном интерфейсе, в случае когда присутствует главное меню, все комманды(actions) на тулбарах, должны быть и в главном меню.
А в ещё более "нормальном" интерфейсе состав меню и тулбаров можно изменять(Customize).
Записан
mozgofil
Гость
« Ответ #21 : Июль 12, 2009, 20:00 »

приведу пример :
Код
C++ (Qt)
 
QToolBar* ptb = new QToolBar("Sample ToolBar");
QMenu* pmFile = new QMenu("&File");
this->addToolBar(ptb);
menuBar()->addMenu(pmFile);
       QAction* actions[3]={.....};
       pmFile->addAction(actions[0]);/// 1 экшн в меню
       ptb->addAction(actions[1]);/// 1 экшн на тулбаре
///1 экшн и в меню и на тулбаре :
       pmFile->addAction(actions[2]);
       ptb->addAction(actions[2]);
 

Чтобы работали actions[0] и actions[1] нужно коннектить и к меню и к тулбару,
но в этом случае actions[2] будет сигналить 2 раза.
action[0] & action[1] и так будут работать если приконнектить прямо к ним, а не к тулбару и.т.п.
Помоему просто автор плохо понимает зачем и как использовать actions.
ну, просветите меня как в вышеприведённом "правильно" сделать
Записан
mozgofil
Гость
« Ответ #22 : Июль 12, 2009, 20:05 »

чушь. коннектить нужно к акшену или к акшенгрупу.
или я не понимаю сути проблемы...
да, вы неправильно понимаете.
суть в том что ВСЕ эшны обрабатываются ОДНОЙ функцией, на вход которой поступает
указатель на  экшн. (этого требует мой фрэймворк, который  поддерживает плагины).
Записан
BRE
Гость
« Ответ #23 : Июль 12, 2009, 20:08 »

А в ещё более "нормальном" интерфейсе состав меню и тулбаров можно изменять(Customize).
Есть набор действия (action). Ты их создал и приконнектил к нужным слотам. А где ты их будешь располагать это уже твое дело. Хочешь часть в меню, часть на тулбаре, часть и там и там. И вызываться они будут один раз, не важно откуда они активировались.

Код
C++ (Qt)
QAction *act1 = new QAction(...);
QAction *act2 = new QAction(...);
QAction *act3 = new QAction(...);
 
connect( act1, SIGNAL( triggered() ), SLOT( slot_act1() ) );
connect( act2, SIGNAL( triggered() ), SLOT( slot_act2() ) );
connect( act3, SIGNAL( triggered() ), SLOT( slot_act3() ) );
 
pmFile->addAction( act1 );
pmFile->addAction( act3 );
 
ptb->addAction( act2 );
ptb->addAction( act3 );
 
« Последнее редактирование: Июль 12, 2009, 21:26 от BRE » Записан
BRE
Гость
« Ответ #24 : Июль 12, 2009, 21:33 »

да, вы неправильно понимаете.
суть в том что ВСЕ эшны обрабатываются ОДНОЙ функцией, на вход которой поступает
указатель на  экшн. (этого требует мой фрэймворк, который  поддерживает плагины).
Соединяй все сигналы triggered всех действий с одним слотов и используй sender() для определения какое действие активировало слот.
Записан
f-r-o-s-t
Гость
« Ответ #25 : Июль 12, 2009, 21:52 »

ну, просветите меня как в вышеприведённом "правильно" сделать

Я думаю из того что написал  BRE , должно было стать понятно как это сделать =)
Записан
ритт
Гость
« Ответ #26 : Июль 12, 2009, 22:42 »

похоже, я всё-таки правильно понимаю "проблему"...
Записан
mozgofil
Гость
« Ответ #27 : Июль 13, 2009, 19:45 »

да, вы неправильно понимаете.
суть в том что ВСЕ эшны обрабатываются ОДНОЙ функцией, на вход которой поступает
указатель на  экшн. (этого требует мой фрэймворк, который  поддерживает плагины).
Соединяй все сигналы triggered всех действий с одним слотов и используй sender() для определения какое действие активировало слот.
- то что надо, спасибо огромное  Улыбающийся
Записан
mozgofil
Гость
« Ответ #28 : Июль 13, 2009, 19:47 »

благодарю всех за внимание , тему можно закрыть
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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