Conjunto QLineEdit centran en Qt
Pregunta
Estoy teniendo una pregunta qt. Quiero que el widget QLineEdit que tiene el foco en el inicio de la aplicación. Tome el siguiente código de ejemplo:
#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 qué line->setFocus()
pone el foco en la línea de inicio widget de @app sólo si se coloca después de la puesta fuera de los widgets y si se utiliza antes de que no funciona?
Solución
teclado enfoque está relacionada a widget orden de tabulación , y el orden de tabulación predeterminado se basa en el orden en que se construyen los widgets . Por lo tanto, la creación de más widgets cambia el foco del teclado. Es por eso que debe hacer el QWidget::setFocus
última llamada.
Me gustaría considerar el uso de una subclase de QWidget
para su ventana principal que anula la showEvent
función virtual y luego establece el foco del teclado a la lineEdit
. Esto tendrá el efecto de dar siempre el foco lineEdit
cuando se muestra la ventana.
Otros consejos
Otro truco que podría funcionar es mediante el temporizador singleshot
:
QTimer::singleShot(0, line, SLOT(setFocus()));
Efectivamente, esto invoca la ranura setFocus()
de la instancia QLineEdit
justo después del sistema de eventos es "libre" para hacerlo, es decir, en algún momento después de que el widget es completamente construido.
Tal vez esto es una actualización como la última respuesta fue en 2012 y la última OP editado la cuestión en 2014. Se forma en que llegaron a este trabajo fue cambiar la política y luego ajustar el enfoque.
line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();
En Qt setFocus () es una ranura, puede intentar otro método sobrecargado que toma un parámetro Qt :: FocusReason como la línea se muestra a continuación:
line->setFocus(Qt::OtherFocusReason);
Usted puede leer acerca de las opciones razón enfoque en el siguiente enlace:
http://doc.trolltech.com/4.4/qt.html # FocusReason-enumeración