Как установить фокус ввода на диалоге в 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()
.