Russian Qt Forum
Ноябрь 01, 2024, 03:06
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
actionTriggered... так надо или Баг?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: actionTriggered... так надо или Баг? (Прочитано 3715 раз)
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
actionTriggered... так надо или Баг?
«
:
Октябрь 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
Гость
Re: actionTriggered... так надо или Баг?
«
Ответ #1 :
Октябрь 13, 2015, 19:06 »
Ну это логично. Экшен то один, к нему 2 сигнала подсоединены. То есть надо было только один раз соединять и всё.
Это фича.
Т.е. подцепил один раз в меню, потом хоть куда его суй - он нужный слот вызовет )
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: actionTriggered... так надо или Баг?
«
Ответ #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
Гость
Re: actionTriggered... так надо или Баг?
«
Ответ #3 :
Октябрь 13, 2015, 19:45 »
Это один объект, в тулбаре и в меню. Т.е. обращаясь тулбар-экшен и меню-экшан, вы получаете один указатель. Так что вы просто неправильно делаете, один слот и одна привязка на один экшн должны быть.
А вы ему 2 сигнала навесили
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: actionTriggered... так надо или Баг?
«
Ответ #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
Сообщений: 2130
Re: actionTriggered... так надо или Баг?
«
Ответ #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
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: actionTriggered... так надо или Баг?
«
Ответ #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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...