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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top