Как установить фокус после выполнения QAction - PullRequest
0 голосов
/ 27 июня 2019

Главный виджет крадет фокус после выполнения QAction. Мне нужно, чтобы фокус был установлен на всплывающий виджет.

QAction *action = new QAction(tr("show popup"), this);
connect(action, &QAction::triggered, this, &MyWidget::showPopup);
addAction(action);

void MyWidget::showPopup()
{
  QMessageBox* popup = new QMessageBox(this);
  popup->setModal(true);
  popup->show();
  popup->setFocus();
}

MyWidget наследуется от QWidget.

1 Ответ

1 голос
/ 27 июня 2019

Поскольку вы только что создали popup, он еще не «там» в графическом интерфейсе.Даже show() не сразу показывает это.После того, как вы покинете область действия MyWidget::showPopup(), цикл событий графического интерфейса продолжит цикл и сможет обработать ваше новое всплывающее окно.Таким образом, вызов setFocus() поступает слишком рано.

Но помощь в процессе:

QWidget::setFocus() - это слот, поэтому вы можете вызвать его.

Если вы используететаймер (QTimer::singleShot(0, popup, SLOT(setFocus()));), он должен работать.
Возможно, вам нужно будет использовать 10 мс вместо 0 мс.

...