Как установить фокус ввода на диалоге в Qt?

в слоте щелчка кнопки, я создаю и exec() диалог с нулевым родителем. Внутри конструктора диалога у меня есть:

this->activateWindow();
this->raise();
this->setFocus();

диалог является модальным приложением и имеет сильный фокус. Однако он не реагирует на события клавиатуры, пока я не нажму на него. Как сделать диалог получить фокус без необходимости его щелчка?

3 ответов


проблема заключалась в том, что я устанавливал флаг окна Qt:Tool. Использование Qt:: Popup или Qt:: Window вместо этого приведет к тому, что фокус ввода будет автоматически установлен при отображении диалога.

Я сам использовал Qt::Window. Некоторые из других флагов, вероятно, также будут работать, но главное, что qdialog с флагом Qt::Tool будет не автоматическая установка фокуса ввода при отображении диалогового окна.


установите фильтр событий для диалогового окна.

classObject->installEventFilter(this);

void className::keyPressEvent(QKeyEvent *event)
{
   if (event->key() == Qt::Key_Space) 
    {
   focusNextChild();
    }
   else 
   {
  QLineEdit::keyPressEvent(event);
   }
}

для получения дополнительной информации см. здесь. http://doc.trolltech.com/4.6/eventsandfilters.html


в моем случае даже настройки Qt:: Window не сделали трюк. Мне пришлось

QMetaObject::invokeMethod(widgetToFocus, "setFocus", Qt::QueuedConnection);

до show() или exec().