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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: В Qt передать фокус.  (Прочитано 7204 раз)
Василий
Гость
« : Август 23, 2006, 13:25 »

На виджете владельце выложены различные виджеты созданные путём комбинации стандартных.
Вопрос. Как научить владельца после получения фокуса одним из дочерних виджетов, переключать фокус на следующий и предыдущий дочерние, не выходя за пределы владельца. Tab не предлагать. :roll:
Записан
bigirbis
Гость
« Ответ #1 : Август 23, 2006, 14:03 »

Если автоматически, то переопиши eventFilter у родителя, проинсталлируй его на интересующих потомков и там уже отлавливай QFocusEvent.
Но задача вообще из разряда экзотических.  :?
Записан
Василий
Гость
« Ответ #2 : Август 23, 2006, 16:26 »

Получилось так, переопределив keyPressEvent у QSpinBox

void mySpinBox::keyPressEvent( QKeyEvent * event )

{
   if ((event->key() == Qt::Key_Left) or (event->key() == Qt::Key_Right))
   {
      event->ignore();
   }
   else
   return QSpinBox::keyPressEvent(event);
}

А у QWidget (панели) на которую положил шарю все и по влево вправо передаю фокус, бегает только по дочерним.
Теперь поменять бы местами Up с Right и Down с Left и было бы всё прекрасно!!! Идеи какие нибудь есть?

void qpanelgroup::goFocus( char a )
{
   //qDebug() << QString("%1 %2").arg((int)currentFocus).arg((int)a);
   if (currentFocus+a<0)
      currentFocus = ff.count()-1;
   else
      if (currentFocus+a>=ff.count())
         currentFocus = 0;
   else
      currentFocus += a;
   
   MyFrame * rr = ff.at(currentFocus);
   //qDebug() << rr->objectName();
   rr->SetFocus();
}

void qpanelgroup::keyPressEvent( QKeyEvent * event )
{
      if (event->key() == Qt::Key_Left)
         emit goFocus(-1);
      else
         if (event->key() == Qt::Key_Right)
            emit goFocus(1);
      else
         event->ignore();
}
Записан
bigirbis
Гость
« Ответ #3 : Август 24, 2006, 08:37 »

ИМХО, изврат.

Закольцуй фокус:

Код:

setTabOrder(a, b); // a to b
setTabOrder(b, c); // a to b to c
setTabOrder(c, d); // a to b to c to d


А потом переопредели:
Код:

bool eventFilter( QObject * object, QEvent * event )
{
 QKeyEvent * ke = dynamic_cast < QKeyEvent > ( event );
 if( ke )
 {
  if( ke->key() == QKeySequence( Qt::Key_Right ) )
  {
   QCoreApplication::sendEvent( object, new QFocusEvent( FocusOut, Qt::TabFocusReason ) );
   return true;
  }
  else if( ke->key() == QKeySequence( Qt::Key_Left ) )
  {
   QCoreApplication::sendEvent( object, new QFocusEvent( FocusOut, Qt::BacktabFocusReason ) );
   return true;
  }
 return QObject::eventFilter( object, event );
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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