Domanda

Sto avendo una domanda qt. Voglio che i widget di QLineEdit di avere l'attenzione all'avvio dell'applicazione. Prendere il seguente codice, ad esempio:

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

Perché line->setFocus() imposta il focus sulla riga di avvio widget di @app solo se viene posto dopo la posa fuori i widget e se usato prima che non funziona?

È stato utile?

Soluzione

tastiera attenzione è legato al widget di ordine di tabulazione , e l'ordine di tabulazione predefinito si basa su l'ordine in cui sono costruiti i widget . Pertanto, la creazione di più i widget cambia il focus della tastiera. È per questo che è necessario effettuare la QWidget::setFocus ultima chiamata.

Vorrei considerare l'utilizzo di una sotto-classe di QWidget per la finestra principale che sostituisce la showEvent funzione virtuale e quindi imposta evidenziazione sul lineEdit. Ciò avrà l'effetto di dare sempre al centro lineEdit quando viene visualizzata la finestra.

Altri suggerimenti

Un altro trucco che potrebbe funzionare è quello di utilizzare il timer singleshot:

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

In effetti, questa richiama la fessura setFocus() dell'istanza QLineEdit subito dopo il sistema di eventi è "libero" di farlo, cioè poco dopo il widget è completamente costruita.

Forse questo è un aggiornamento come l'ultima risposta è stata nel 2012 e PO ultima modifica la questione nel 2014. Essi modo in cui ho ottenuto questo al lavoro è stato quello di cambiare la politica e quindi impostare la messa a fuoco.

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

In Qt setFocus () è una slot, si può provare altro metodo di overload che prende un parametro Qt :: FocusReason come la linea illustrato di seguito:

line->setFocus(Qt::OtherFocusReason);

Si può leggere su opzioni ragione attenzione nel seguente link:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top