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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с обходом по tab'у при установке eventFilter  (Прочитано 4297 раз)
Crazy Sage
Гость
« : Октябрь 12, 2015, 16:54 »

Доброго дня. Сразу предупреждаю, что я в курсе, что описаная ниже конструкция несколько порнографична, но как её радикально улучшить я не представляю.

Есть сложная главная форма, основная её часть создана в дизайнере, но на тулбар надо добавить несколько QComboBox'ов, чего дизайнер делать не позволяет, поэтому эти виджеты добавляются уже в cpp.
Далее возникла необходимость управлять курсором с клавиатуры, но если фокус стоит на этих комбобоксах или одном из QTreeWidget'ов, присутствующих на форме, то клавиатурные события до DlgMain::keyPressEvent(QKeyEvent*) не доходят.
Для исправления этого пришлось делать на эти виджеты installEventFilter
сам фильтр имеет следующий вид
Код:
bool DlgMain::eventFilter(QObject* o, QEvent* ev)
{
if(ev->type()==QEvent::KeyPress)
keyPressEvent(static_cast<QKeyEvent*>(ev));
return false;
}

Чтобы сами эти виджеты тоже могли обрабатывать клавиатуру. Вот только на выходе после установки фильтра хотя бы на один из этих виджетов хаотически рушится порядок обхода комбобоксов по табу (в зависимости от сочетания виджетов с установленной фильтрацией табуляция заходит на один или два из комбобоксов, игнорируя остальные).
В чём может быть косяк с этим фильтром или как можно встроить комбобоксы в обход по табу не делая setTabOrder для всех виджетов с главной формы (их очень уж много)?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #1 : Октябрь 12, 2015, 18:11 »

Например, вы всегда делаете return false; даже если фильтр ловит эвент. А return false; значит, что обработка эвента пойдет дальше.
Записан

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 не волк, в лес не уйдёт
Crazy Sage
Гость
« Ответ #2 : Октябрь 12, 2015, 19:44 »

Ну и я так понимаю, что в такой ситуации эвент с табуляцией должен обработаться как будто eventFilter'а нет (в keyPressEvent я таб не обрабатываю), или я не прав?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

а что должно происходить в DlgMain::keyPressEvent ?

Записан

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 не волк, в лес не уйдёт
Crazy Sage
Гость
« Ответ #4 : Октябрь 13, 2015, 07:59 »

Там обрабатывается сугубо управление курсором мыши с клавиатуры, всё на буквенных клавишах.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

Там обрабатывается сугубо управление курсором мыши с клавиатуры, всё на буквенных клавишах.

А базовый keyPressEvent там вызывается после вашей обработки? Если нет, то это может быть проблемой передачи фокуса.
Записан

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 не волк, в лес не уйдёт
Crazy Sage
Гость
« Ответ #6 : Октябрь 13, 2015, 13:07 »

А вот об этом не подумал, попробую.
Записан
Crazy Sage
Гость
« Ответ #7 : Октябрь 15, 2015, 08:14 »

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


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