質問
QTの質問があります。アプリケーションの起動時に QLineEdit ウィジェットにフォーカスを置きたいと考えています。たとえば、次のコードを考えてみましょう。
#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();
}
どして line->setFocus()
ウィジェットをレイアウトした後に配置され、機能しなくなる前に使用された場合にのみ、ライン ウィジェット @app 起動にフォーカスを設定しますか?
解決
キーボードフォーカス ウィジェットに関係する タブオーダー, 、およびデフォルトのタブオーダー ウィジェットが構築される順序に基づきます. 。したがって、さらにウィジェットを作成すると、キーボードのフォーカスが変更されます。だからこそ、 QWidget::setFocus
最後に電話してください。
のサブクラスの使用を検討します QWidget
をオーバーライドするメインウィンドウの場合、 showEvent
仮想関数を実行し、キーボードのフォーカスを lineEdit
. 。これにより、常に lineEdit
ウィンドウが表示されているときにフォーカスします。
他のヒント
働くかもしれないもう一つのトリックはsingleshot
タイマーを使用することです。
QTimer::singleShot(0, line, SLOT(setFocus()));
事実上、これは、ウィジェットが完全に構築され、すなわち、いつか後にイベントシステムは、そうする「自由」である右後setFocus()
インスタンスのQLineEdit
スロットを起動します。
おそらくこれはアップデートです
line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();
Qtのは、setFocus()はスロットがあり、あなたは、以下に示すようなラインのQt :: FocusReasonパラメータを受け取り、他のオーバーロードされたメソッドを試すことができます:
line->setFocus(Qt::OtherFocusReason);
あなたは以下のリンクでフォーカス理由オプションについて読むことができます: