Установите фокус 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()
устанавливает фокус на строке widget @app startup только в том случае, если она размещена после размещения виджетов и если использовалась до того, как она не работала?
Решение
Фокус клавиатуры связано с виджетом порядок вкладок, и порядок вкладок по умолчанию основан на порядке, в котором создаются виджеты.Таким образом, создание большего количества виджетов изменяет фокус клавиатуры.Вот почему вы должны сделать QWidget::setFocus
звоните последним.
Я бы рассмотрел возможность использования подкласса QWidget
для вашего главного окна, которое переопределяет showEvent
виртуальная функция, а затем устанавливает фокус клавиатуры на lineEdit
.Это будет иметь эффект постоянного предоставления lineEdit
сфокусируйтесь, когда появится окно.
Другие советы
Другой трюк, который может сработать, заключается в использовании singleshot
таймер:
QTimer::singleShot(0, line, SLOT(setFocus()));
Фактически, это вызывает setFocus()
слот для QLineEdit
экземпляр сразу после события system "свободен" для этого, т.е.через некоторое время после того, как виджет будет полностью создан.
Возможно, это обновление, поскольку последний ответ был в 2012 году, а OP в последний раз редактировал вопрос в 2014 году.Способ, которым я добился, чтобы это сработало, состоял в том, чтобы изменить политику, а затем расставить акценты.
line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();
В Qt SetFocus() - это слот, вы можете попробовать другой перегруженный метод, который принимает параметр Qt::FocusReason, подобный строке, показанной ниже:
line->setFocus(Qt::OtherFocusReason);
Вы можете прочитать о параметрах причины фокусировки по следующей ссылке: