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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с обходом по tab'у при установке eventFilter  (Прочитано 4648 раз)
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]   Вверх
  Печать  
 
Перейти в:  


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