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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как обработать потерю фокуса группой элементов?  (Прочитано 6073 раз)
Ytz
Гость
« : Октябрь 24, 2008, 22:49 »

Итак задача: есть группа виджетов (строки ввода, кнопки) потерю фокуса которыми я хочу отрабатывать, то есть именно уход из этой группы, а не переход фокуса по элементам группы.
Моя попытка: класс наследник от QFrame, который создает эти элементы и ими владеет, но к сожалению его методы focusOutEvent и focusInEvent никогда не вызываются.
Также пытался решить задачу используя флаги - решение громоздкое, корявое, к тому же не работающее.
Буду рад любым подсказкам.
Записан
ритт
Гость
« Ответ #1 : Октябрь 24, 2008, 23:47 »

фрэйм и не должен получать данные события...
всем виджетам на фрэйме установи ивентФильтр. на фокусИн устанавливай временный флаг, на фокусОут сбрасывай. при сбросе флага запускай таймер (скажем, на 50мс) - если в момент срабатывания таймера флаг снят, можно считать, что группа потеряла фокус...
я правильно понял задачу?
« Последнее редактирование: Октябрь 24, 2008, 23:52 от Константин » Записан
Tonal
Гость
« Ответ #2 : Октябрь 25, 2008, 08:22 »

А зачем это нужно?
Что должно происходить при получении  или потере фокуса группой?
Записан
ритт
Гость
« Ответ #3 : Октябрь 25, 2008, 08:34 »

ну, может какая-то аццкая подсказка выпрыгивает Улыбающийся
Записан
Tonal
Гость
« Ответ #4 : Октябрь 25, 2008, 08:44 »

Собрать на каком-нибудь групповом виджете - том же Frame, GroupBox-е, установить везде эвентфилтры и проверят в focus эвентах - если фокусный элемент детё группового виджета - стал быть фокус в ём, не дитё - фокус вовне.
Записан
ритт
Гость
« Ответ #5 : Октябрь 25, 2008, 09:02 »

но это придётся ивентфильтр вешать _везде_
если это не хелловорлд, то ёпнуться можно Улыбающийся
Записан
Alex03
Гость
« Ответ #6 : Октябрь 25, 2008, 09:40 »

Законектить:
Цитировать
void QApplication::focusChanged ( QWidget * old, QWidget * now )   [signal]
И в слоте проверять чёнить типа:
Код:
if(now && myGroupWidget.children().contains(now))
{
    ...
}
или
Код:
if(now == myGroupWidget.focusWidget())
{
    ...
}
Записан
ритт
Гость
« Ответ #7 : Октябрь 25, 2008, 09:59 »

пля...низачОт мне Грустный

Ytz, делай как Алекс сказал - самое правильное и удобное решение, т.к. focusChanged высылается 1 раз после того, как оба виджета уже получили события и среагировали...
Записан
Ytz
Гость
« Ответ #8 : Октябрь 25, 2008, 15:48 »

Всем спасибо! Работает как часы:

Код:
  
connect(static_cast<QApplication*>(QCoreApplication::instance()),
  SIGNAL(focusChanged (QWidget*, QWidget*)),
  this, SLOT(OnFocusChanged(QWidget*, QWidget*)));


void Frame::OnFocusChanged(QWidget* old, QWidget* now)
{
  if (old && this->children().contains(old)
    && now && !this->children().contains(now))
  {
    // Focus out
  }
  else
  if (now && this->children().contains(now))
  {
    // Focus in
  }
}
Записан
Вячеслав
Гость
« Ответ #9 : Октябрь 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.

Может проще ?
Записан
Ytz
Гость
« Ответ #10 : Октябрь 25, 2008, 23:45 »

Может проще ?
Да, конечно проще Улыбающийся
« Последнее редактирование: Октябрь 25, 2008, 23:48 от Ytz » Записан
Tonal
Гость
« Ответ #11 : Октябрь 26, 2008, 09:49 »

Ну и вместо проверки this->children().contains(now) можно ведь this == now->parent()?
Нафига перебор там где можно напрямую? Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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