Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Ytz от Октябрь 24, 2008, 22:49



Название: Как обработать потерю фокуса группой элементов?
Отправлено: 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
Всем спасибо! Работает как часы:

Код:
  
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
  }
}


Название: 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()?
Нафига перебор там где можно напрямую? :)