Название: Как обработать потерю фокуса группой элементов? Отправлено: Ytz от Октябрь 24, 2008, 22:49 Итак задача: есть группа виджетов (строки ввода, кнопки) потерю фокуса которыми я хочу отрабатывать, то есть именно уход из этой группы, а не переход фокуса по элементам группы.
Моя попытка: класс наследник от QFrame, который создает эти элементы и ими владеет, но к сожалению его методы focusOutEvent и focusInEvent никогда не вызываются. Также пытался решить задачу используя флаги - решение громоздкое, корявое, к тому же не работающее. Буду рад любым подсказкам. Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: ритт от Октябрь 24, 2008, 23:47 фрэйм и не должен получать данные события...
всем виджетам на фрэйме установи ивентФильтр. на фокусИн устанавливай временный флаг, на фокусОут сбрасывай. при сбросе флага запускай таймер (скажем, на 50мс) - если в момент срабатывания таймера флаг снят, можно считать, что группа потеряла фокус... я правильно понял задачу? Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: Tonal от Октябрь 25, 2008, 08:22 А зачем это нужно?
Что должно происходить при получении или потере фокуса группой? Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: ритт от Октябрь 25, 2008, 08:34 ну, может какая-то аццкая подсказка выпрыгивает :)
Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: Tonal от Октябрь 25, 2008, 08:44 Собрать на каком-нибудь групповом виджете - том же Frame, GroupBox-е, установить везде эвентфилтры и проверят в focus эвентах - если фокусный элемент детё группового виджета - стал быть фокус в ём, не дитё - фокус вовне.
Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: ритт от Октябрь 25, 2008, 09:02 но это придётся ивентфильтр вешать _везде_
если это не хелловорлд, то ёпнуться можно :) Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: Alex03 от Октябрь 25, 2008, 09:40 Законектить:
Цитировать void QApplication::focusChanged ( QWidget * old, QWidget * now ) [signal] И в слоте проверять чёнить типа:Код: if(now && myGroupWidget.children().contains(now)) Код: if(now == myGroupWidget.focusWidget()) Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: ритт от Октябрь 25, 2008, 09:59 пля...низачОт мне :(
Ytz, делай как Алекс сказал - самое правильное и удобное решение, т.к. focusChanged высылается 1 раз после того, как оба виджета уже получили события и среагировали... Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: Ytz от Октябрь 25, 2008, 15:48 Всем спасибо! Работает как часы:
Код:
Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: Вячеслав от Октябрь 25, 2008, 23:26 а нафига пляски со статик-кастом ?
Цитировать qApp A global pointer referring to the unique application object. It is equivalent to the pointer returned by the QCoreApplication::instance() function except that, in GUI applications, it is a pointer to a QApplication instance. Может проще ? Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: Ytz от Октябрь 25, 2008, 23:45 Может проще ? Да, конечно проще :)Название: Re: Как обработать потерю фокуса группой элементов? Отправлено: Tonal от Октябрь 26, 2008, 09:49 Ну и вместо проверки this->children().contains(now) можно ведь this == now->parent()?
Нафига перебор там где можно напрямую? :) |