Вопрос

У меня возник вопрос 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);

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top