Установить фокус QLineEdit в Qt - PullRequest
19 голосов
/ 09 февраля 2009

У меня вопрос QT. Я хочу, чтобы виджет QLineEdit имел фокус при запуске приложения. Возьмите следующий код, например:

#include <QtGui/QApplication>
#include <QtGui/QHBoxLayout>
#include <QtGui/QPushButton>
#include <QtGui/QLineEdit>
#include <QtGui/QFont>


 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

     QWidget *window = new QWidget();
     window->setWindowIcon(QIcon("qtest16.ico"));
     window->setWindowTitle("QtTest");

     QHBoxLayout *layout = new QHBoxLayout(window);

     // Add some widgets.
     QLineEdit *line = new QLineEdit();

     QPushButton *hello = new QPushButton(window);
     hello->setText("Select all");
     hello->resize(150, 25);
     hello->setFont(QFont("Droid Sans Mono", 12, QFont::Normal));

     // Add the widgets to the layout.
     layout->addWidget(line);
     layout->addWidget(hello);

     line->setFocus();

     QObject::connect(hello, SIGNAL(clicked()), line, SLOT(selectAll()));
     QObject::connect(line, SIGNAL(returnPressed()), line, SLOT(selectAll()));

     window->show();
     return app.exec();
 }

Почему line->setFocus() устанавливает фокус на автозапуск @app линейного виджета, только если он размещен после размещения виджетов и используется до того, как он не работает?

Ответы [ 4 ]

24 голосов
/ 08 марта 2009

Еще один прием, который может сработать, - использование таймера singleshot:

QTimer::singleShot(0, line, SLOT(setFocus()));

По сути, это вызывает слот setFocus() экземпляра QLineEdit сразу после того, как система событий «свободна», то есть через некоторое время после полного создания виджета.

23 голосов
/ 09 февраля 2009

Фокус клавиатуры относится к виджету порядок вкладок , а порядок вкладок по умолчанию основан на порядке, в котором создаются виджеты . Поэтому создание большего количества виджетов меняет фокус клавиатуры. Вот почему вы должны сделать QWidget::setFocus последним.

Я бы рассмотрел использование подкласса QWidget для вашего главного окна, которое переопределяет виртуальную функцию showEvent, а затем устанавливает фокус клавиатуры на lineEdit. Это будет иметь эффект всегда фокусировки lineEdit при отображении окна.

2 голосов
/ 10 сентября 2016

Возможно, это обновление, поскольку последний ответ был в 2012 году, а ФП последний раз редактировал вопрос в 2014 году. Они заставили меня работать, чтобы изменить политику и затем установить фокус.

line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();
1 голос
/ 09 февраля 2009

В Qt setFocus () - это слот, вы можете попробовать другой перегруженный метод, который принимает параметр Qt :: FocusReason, как показано ниже:

line->setFocus(Qt::OtherFocusReason);

О параметрах причины фокуса можно прочитать по следующей ссылке:

http://doc.trolltech.com/4.4/qt.html#FocusReason-enum

...