Definir foco QLineEdit em Qt
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?
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: