Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Василий от Август 23, 2006, 13:25



Название: В Qt передать фокус.
Отправлено: Василий от Август 23, 2006, 13:25
На виджете владельце выложены различные виджеты созданные путём комбинации стандартных.
Вопрос. Как научить владельца после получения фокуса одним из дочерних виджетов, переключать фокус на следующий и предыдущий дочерние, не выходя за пределы владельца. Tab не предлагать. :roll:


Название: В Qt передать фокус.
Отправлено: bigirbis от Август 23, 2006, 14:03
Если автоматически, то переопиши eventFilter у родителя, проинсталлируй его на интересующих потомков и там уже отлавливай QFocusEvent.
Но задача вообще из разряда экзотических.  :?


Название: Получилось так, переопределив keyPressEvent у QSpinBox
Отправлено: Василий от Август 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();
}


Название: В Qt передать фокус.
Отправлено: bigirbis от Август 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 );
}