teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追加質問の回答追加

2019/12/03 10:57

投稿

nomuken
nomuken

スコア1627

answer CHANGED
@@ -11,4 +11,19 @@
11
11
  QTimer.singleShot(0, self.lineEdit4.setFocus)
12
12
 
13
13
  return super().eventFilter(obj, event)
14
- ```
14
+ ```
15
+
16
+ > QTimer.singleShot(0, self.lineEdit4.setFocus)
17
+ を書くことで「eventFilterが終わった後」になるのかが理解できずにいます。
18
+
19
+ タイマーも「ボタンを押した」、「テキストボックスの内容が変化した」などのイベントの一種です。
20
+ `eventFilter`も「あるテキストボックスにフォーカスが移った」というイベントを契機に呼び出されています。
21
+
22
+ 発生したイベント処理はイベントキューにキューイングされ、`app.exec_()`の中で順番に処理されています。
23
+ 何かの関数を実行している最中にいきなり実行されるわけではないんですね。
24
+
25
+ で、`QTimer.singleShot(0, self.lineEdit4.setFocus)`ですが経過時間が0なので即座にタイマーイベントが発生します。で、そのイベントは前述のイベントキューに入ります。ただ、今は「あるテキストボックスにフォーカスが移った」を処理中でその瞬間には処理されません。「あるテキストボックスにフォーカスが移った」イベント処理が終わった後にイベントキューにタイマーイベントがあるのでそれが処理されます。
26
+
27
+ > また、QTimerを使わないと「eventFilterが終わった後」の処理を書くことはできないのでしょうか。
28
+
29
+ わかりません。私の知っている知識ではQTimerだけです。前に説明した通り、何かイベントを発生させて、そのイベント処理として`self.lineEdit4.setFocus()`を実行できれば同じことはできるとは思います。