2009-02-09 25 views
14

Tengo una pregunta de qt. Quiero que el widget QLineEdit tenga el foco al inicio de la aplicación. Tome el siguiente código de ejemplo:Establecer el foco de QLineEdit en 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(); 
} 

¿Por qué line->setFocus() ajusta el enfoque en la puesta en marcha @app widget de línea sólo si se coloca después de la puesta fuera de los widgets y si se utiliza antes de que no funciona?

Respuesta

21

Keyboard focus está relacionada a widget tab order, y el orden de tabulación predeterminado se basa en el orden en que se construyen los widgets. Por lo tanto, crear más widgets cambia el foco del teclado. Es por eso que debe hacer que el QWidget :: setFocus llame al último.

Consideraría utilizar una subclase de QWidget para su ventana principal que anule la función virtual showEvent y luego ajuste el foco del teclado a la edición de línea. Esto tendrá el efecto de proporcionar siempre el foco de edición de línea cuando se muestre la ventana.

+2

Corrección pequeña: el orden de las pestañas no es el orden en el que los niños están _construidos_, sino el orden en el que se agregan _ al padre. –

+0

Probablemente sea cierto, pero estaba parafraseando la documentación de Qt que dice: "Puede personalizar el orden de tabulación usando QWidget :: setTabOrder(). (Si no lo hace, Tab generalmente mueve el foco en el orden de construcción del widget.) " –

1

En Qt setFocus() es una ranura, puede intentar otro método sobrecargado que toma un parámetro Qt :: FocusReason igual que 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 link:

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

+0

Hi milot. Gracias por tu respuesta. La cuestión es que incluso si cambio a lo que escribiste, no funciona. Como es una ranura para widgets, supongo que puedo conectarle una señal al inicio de la aplicación. ¿Sabes qué señal es esa? Gracias de nuevo. – hyperboreean

+0

Puede ser cualquier señal que su firma coincida con la ranura, por lo que se puede conectar a una señal que no toma ningún parámetro. – milot

21

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 esté completamente construido.

+0

esto funcionó como un hechizo, el sistema de eventos se agregó libre a la ventaja de enfocar correctamente el lineedit recién creado (dinámicamente) en mycase. Gracias – Ja8zyjits

1

Quizás esta sea una actualización, ya que la última respuesta fue en 2012 y la OP editó por última vez la pregunta en 2014. La forma en que logré que esto funcionara fue cambiar la política y luego establecer el foco.

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