Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: nova от Январь 25, 2007, 15:49



Название: Фокус ввода [qt-4.2.2]
Отправлено: nova от Январь 25, 2007, 15:49
Не смог найти решение следующей задачи:
Есть диалог. На нем расположены несколько воджетов, Каждый из которых содержит другие виджеты ( поля ввода, кнопки ... ).
Как определить ( получить сигнал что ) фокус ввода получил/потерял один из подчиненных воджетов?


Название: Фокус ввода [qt-4.2.2]
Отправлено: Dendy от Январь 25, 2007, 17:01
Может так.

Код:
widget->installEventFilter( this );
...
bool This::eventFilter( QObject * o, QEvent * e )
{
  if ( e->type() == QEvent::FocusIn )
    ...
  if ( e->type() == QEvent::FocusOut )
    ...
}


Название: Фокус ввода [qt-4.2.2]
Отправлено: nova от Январь 26, 2007, 00:23
так то оно так.
но есть нюанс :)
Уточню задачу:
на форме есть QTableView(), при входе в форму модель привязанная к виеву пуста.
есть код:
Код:

bool CashePayment::eventFilter(QObject * obj, QEvent * event)
{
  if (obj == chequePaymantsView && event->type() == QEvent::FocusIn)
  {
    if(!PaymentModel->rowCount())
    {
      PaymentModel->insertRows(0,1);
      chequePaymantsView->setCurrentIndex (PaymentModel->index(0,0));
    }

  }
  else if (obj == chequePaymantsView && event->type() == QEvent::FocusOut)
  {
    PaymentModel->deleteEmpty();
  }

когда фокус попадает в виев в модели создается строка, когда модель теряет фокус и пользователь не ввел данных пустая запись из модели удаляется. И все было бы класно но как только пытаешся изменить данные фокус переходит к делегату и запись удаляется из модели, получается бардак :)

добавлено спустя 6 часов 33 минуты:

 Кажись поборол :)
Если кому понадобится надо так:
Код:

bool CashePayment::eventFilter(QObject * obj, QEvent * event)
{
  if (obj == chequePaymantsView && event->type() == QEvent::FocusIn)
  {
    if(!PaymentModel->rowCount())
    {
      PaymentModel->insertRow(0);
    }
    chequePaymantsView->setCurrentIndex (PaymentModel->index(PaymentModel->rowCount()-1,0));
  }
  else if (obj == chequePaymantsView
           && event->type() == QEvent::FocusOut
           && static_cast<QFocusEvent*>(event)->reason() != Qt::OtherFocusReason )
  {
      PaymentModel->deleteEmpty();
      chequePaymantsView->selectionModel()->clear();
  }
  // standard event processing
  return QObject::eventFilter(obj, event);

}