Pergunta

Estou tendo uma pergunta qt. Eu quero o widget QLineEdit ter o foco na inicialização do aplicativo. Tome o seguinte código por exemplo:

#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();
 }

Por que line->setFocus() define o foco no @app inicialização Widget de linha somente se ele é colocado depois colocar para fora os widgets e, se usado antes ele não está funcionando?

Foi útil?

Solução

O foco do teclado está relacionada com Widget ordem de tabulação , e a ordem de tabulação padrão é baseado na ordem em que os widgets são construídos . Portanto, a criação de mais widgets muda o foco do teclado. É por isso que você deve fazer o QWidget::setFocus chamar passado.

eu consideraria usando uma sub-classe de QWidget para a sua janela principal, que substitui o showEvent função virtual e em seguida, define o foco do teclado para o lineEdit. Isto terá o efeito de sempre dando o foco lineEdit quando a janela é mostrado.

Outras dicas

Outro truque que o trabalho poder é usando o timer singleshot:

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

Na prática, isto invoca o slot setFocus() do direito instância QLineEdit depois que o sistema evento é "livre" para fazê-lo, ou seja, em algum momento após o widget é completamente construído.

Talvez esta seja uma atualização como a última resposta foi em 2012 ea OP última edição a questão em 2014. Eles maneira que eu tenho isso para o trabalho era mudar a política e, em seguida, definir o foco.

line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();

Em Qt setFocus () é um slot, você pode tentar outro método sobrecarregado que leva um parâmetro Qt :: FocusReason como a linha mostrado abaixo:

line->setFocus(Qt::OtherFocusReason);

Você pode ler sobre as opções razão foco no link a seguir:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top