2009-02-09 6 views
14

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

#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 только если он помещен после раскладывать виджеты и, если они используются, прежде чем он не работает?

ответ

21

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

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

+2

Небольшая коррекция: порядок вкладок - это не порядок, в котором дети _constructed_, а порядок, в котором они _added_, родительскому. –

+0

Возможно, это правда, но я перефразировал Qt-документацию taht: «Вы можете настроить порядок вкладок с помощью QWidget :: setTabOrder(). (Если вы этого не сделаете, Tab обычно перемещает фокус в порядке построения виджета.) « –

1

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

line->setFocus(Qt::OtherFocusReason); 

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

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

+0

Hi milot. Спасибо за Ваш ответ. Дело в том, что даже если я перейду к тому, что вы написали, это не сработает. Поскольку это слот виджета, я предполагаю, что могу подключить к нему сигнал при запуске приложения. Вы знаете, какой сигнал это? Еще раз спасибо. – hyperboreean

+0

Это может быть любой сигнал, который соответствует его сигнатуре с слотом, поэтому он может быть подключен к сигналу, который не принимает никаких параметров. – milot

21

Другого трюком, который может работать является использованием SingleShot таймера:

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

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

+0

это работало как шарм, система событий была добавлена ​​в дополнение к тому, чтобы правильно фокусировать новый (динамически) созданный lineedit в mycase. благодаря – Ja8zyjits

1

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

line->setFocusPolicy(Qt::StrongFocus); 
line->setFocus(); 
Смежные вопросы