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()));
_
事実上、これはQLineEdit
インスタンスのsetFocus()
スロットを、イベントシステムが「フリー」になってすぐに、つまりウィジェットが完全に構築された直後に呼び出します。
おそらくこれは更新です。最後の回答は2012年で、OPは最後に2014年に質問を編集しました。これを機能させる方法は、ポリシーを変更してフォーカスを設定することでした。
line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();
QtではsetFocus()はスロットです。以下に示すようなQt :: FocusReasonパラメータを受け取る他のオーバーロードメソッドを試すことができます。
line->setFocus(Qt::OtherFocusReason);
フォーカスの理由オプションについては、次のリンクをご覧ください。