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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: actionTriggered... так надо или Баг?  (Прочитано 3522 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« : Октябрь 13, 2015, 12:46 »

Всем Привет,

вот сегодня ВНЕЗАПНО заметили такую ВЕСЧъ:

Есть QMenu, и есть QToolBar. И туда, и туда пакуется один и тот же QAction.
И меню, и тулбар подключены сигналом actionTriggered() к слоту.
Теперь внимание: если кликаем по кнопке экшина на тулбаре - вызывается И actionTriggered тулбара, И actionTriggered меню.
Т.е. в слот мы попадаем 2 (ДВА) раза.
То же самое происходит, если выбрать экшин в меню. Сначала вызовется actionTriggered меню, потом - тулбара.

Это так и надо? Или БАГъ? В доке про подобное поведение ни слова...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #1 : Октябрь 13, 2015, 19:06 »

Ну это логично. Экшен то один, к нему 2 сигнала подсоединены. То есть надо было только один раз соединять и всё.
Это фича.
Т.е. подцепил один раз в меню, потом хоть куда его суй - он нужный слот вызовет )
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Октябрь 13, 2015, 19:34 »

То, что слот экшена вызовется - логично.
А то, что слот ТУЛБАРА actionTriggered(QAction*) вызывается, когда экшин из МЕНЮ вызван - как-то имхо не очень...
Проблема в том, что один и тот же экшин несколько раз триггеруется в таком случае.
Поэтому непонятно пока, как это расценивать.
« Последнее редактирование: Октябрь 13, 2015, 19:36 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #3 : Октябрь 13, 2015, 19:45 »

Это один объект, в тулбаре и в меню. Т.е. обращаясь тулбар-экшен и меню-экшан, вы получаете один указатель. Так что вы просто неправильно делаете, один слот и одна привязка на один экшн должны быть.
А вы ему 2 сигнала навесили Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Октябрь 13, 2015, 21:34 »

Мы как полагали изначально - есть тулбар, на котором Х экшнов. Часть из них плюс некоторые другие размещены параллельно в меню. Конечно, можно каждый экшн тупо связать через сигнал QAction::triggered с соответствующими слотами - и это будет работать. Но по архитектурным причинам (местами используются шаблоны, которые не кушает мок) представлялось оптимальным использовать сигналы QToolBar::actionTriggered(QAction*) и QMenu::actionTriggered(QAction*). Далее каждый из них связывается с центральным слотом-диспетчером, который и обрабатывает тригерованный экшн.

В документации Qt НИКАК не акцентировано то, что actionTriggered-сигналы будут эмитироваться ОДНОВРЕМЕННО ВСЕМИ виджетами, с которыми связан конкретный экшн. Т.е. эта связь абсолютно не очевидна пользователю классов QToolBar и QMenu. Про детали внутренней реализации механизма actionTriggered нигде не сказано. Ведь пользователь ожидает, что при нажатии кнопки на тулбаре будет вызван сигнал QToolBar::actionTriggered, но никак не QMenu::actionTriggered.

А получается по сути, если один и тот же экшен посажен в N виджетов - то при его вызове "сдетонирует" каждый из этих виджетов, даже если он не был тригерован пользователем.
« Последнее редактирование: Октябрь 13, 2015, 21:37 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Октябрь 14, 2015, 07:03 »

Цитировать
void QToolBar::actionTriggered(QAction * action)
This signal is emitted when an action in this toolbar is triggered. This happens when the action's tool button is pressed, or when the action is triggered in some other way outside the toolbar. The parameter holds the triggered action.

Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Октябрь 14, 2015, 09:30 »

Хм, интересно. У нас Qt 5.3, надо будет еще раз посмотреть, спасибо...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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