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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Фокус ввода [qt-4.2.2]  (Прочитано 3366 раз)
nova
Гость
« : Январь 25, 2007, 15:49 »

Не смог найти решение следующей задачи:
Есть диалог. На нем расположены несколько воджетов, Каждый из которых содержит другие виджеты ( поля ввода, кнопки ... ).
Как определить ( получить сигнал что ) фокус ввода получил/потерял один из подчиненных воджетов?
Записан
Dendy
Гость
« Ответ #1 : Январь 25, 2007, 17:01 »

Может так.

Код:
widget->installEventFilter( this );
...
bool This::eventFilter( QObject * o, QEvent * e )
{
  if ( e->type() == QEvent::FocusIn )
    ...
  if ( e->type() == QEvent::FocusOut )
    ...
}
Записан
nova
Гость
« Ответ #2 : Январь 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);

}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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