Установите фокусировку QLineEdit в Qt
У меня вопрос 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 только в том случае, если он размещен после выкладки виджетов и если он используется до того, как он не работает?
Ответы
Ответ 1
Фокус клавиатуры связан с виджетами порядок вкладок, а порядок вкладок по умолчанию основан на порядке построения виджетов. Поэтому создание большего количества виджетов изменяет фокус клавиатуры. Вот почему вы должны сделать QWidget:: setFocus последним.
Я бы рассмотрел использование подкласса QWidget для вашего основного окна, которое переопределяет виртуальную функцию showEvent, а затем устанавливает фокус клавиатуры для редактирования строки. Это приведет к тому, что всегда будет отображаться фокус редактирования линии при отображении окна.
Ответ 2
Другим трюком, который может работать, является использование таймера одиночного снимка:
QTimer::singleShot(0, line, SLOT(setFocus()));
Фактически, это вызывает слот setFocus() экземпляра QLineEdit сразу после того, как система событий "свободна", чтобы сделать это, то есть когда-то после полного создания виджета.
Ответ 3
В Qt setFocus() - это слот, вы можете попробовать другой перегруженный метод, который принимает параметр Qt:: FocusReason, как показано ниже:
line->setFocus(Qt::OtherFocusReason);
Вы можете прочитать информацию о параметрах причины фокуса по следующей ссылке:
http://doc.trolltech.com/4.4/qt.html#FocusReason-enum
Ответ 4
Возможно, это обновление, поскольку последний ответ был в 2012 году, и последний вопрос в последний раз редактировался в 2014 году. Как я это сделал, это изменить политику, а затем установить фокус.
line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();