web-dev-qa-db-ja.com

QtでQLineEditフォーカスを設定する

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の起動にフォーカスを設定するのですか?

21
hyperboreean

キーボードフォーカス はウィジェットに関連しています タブの順序 、およびデフォルトのタブの順序はウィジェットが構築される順序に基づいています。したがって、より多くのウィジェットを作成すると、キーボードのフォーカスが変わります。 QWidget::setFocus 最後に呼び出します。

QWidget 仮想関数をオーバーライドし、キーボードフォーカスをshowEventに設定するメインウィンドウにlineEditのサブクラスを使用することを検討します。これには、ウィンドウが表示されているときに常にlineEditフォーカスを与えるという効果があります。

24
Judge Maygarden

うまくいくかもしれないもう一つのトリックはsingleshotタイマーを使うことです:

_QTimer::singleShot(0, line, SLOT(setFocus()));
_

事実上、これはQLineEditインスタンスのsetFocus()スロットを、イベントシステムが「フリー」になってすぐに、つまりウィジェットが完全に構築された直後に呼び出します。

25
Ariya Hidayat

おそらくこれは更新です。最後の回答は2012年で、OPは最後に2014年に質問を編集しました。これを機能させる方法は、ポリシーを変更してフォーカスを設定することでした。

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

QtではsetFocus()はスロットです。以下に示すようなQt :: FocusReasonパラメータを受け取る他のオーバーロードメソッドを試すことができます。

line->setFocus(Qt::OtherFocusReason);

フォーカスの理由オプションについては、次のリンクをご覧ください。

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

1
milot