🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2574閲覧

setFocusをするとカーソルが増える。 Python3.7 Pyqt5 QlineEdit

WMS

総合スコア37

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/11/11 01:42

編集2019/11/13 08:58

Python3.7 Pyqt5で作成したlineEditが4つあります。
マウスでクリックした際、4番目の lineEdit にフォーカスを移動させ、
4番目の lineEdit にクリックされた lineEditのオブジェクト名を表示する
というものを以前教えて頂いたサンプルを元に作成しました。

4番目の lineEdit にクリックされたオブジェクト名は表示できるのですが、
クリックされた lineEdit にカーソルが残ってしまいます。
最終的には画面にカーソルが4つ表示されてしまします。

クリックされた lineEdit にカーソルが表示されないようにするにはどうしたらよいでしょうか。
回避策をご教授お願い致します。

python

1import sys 2from PyQt5.QtWidgets import * 3from PyQt5.QtCore import * 4 5 6class MainWindow(QMainWindow): 7 def __init__(self): 8 super().__init__() 9 self.initUI() 10 11 def initUI(self): 12 self.lineEdit1 = QLineEdit("", self) 13 self.lineEdit1.setObjectName("lineEdit1") 14 self.lineEdit2 = QLineEdit("", self) 15 self.lineEdit2.setObjectName("lineEdit2") 16 self.lineEdit3 = QLineEdit("", self) 17 self.lineEdit3.setObjectName("lineEdit3") 18 self.lineEdit4 = QLineEdit("", self) 19 self.lineEdit4.setObjectName("lineEdit4") 20 21 vbox = QVBoxLayout() 22 vbox.addWidget(self.lineEdit1) 23 vbox.addWidget(self.lineEdit2) 24 vbox.addWidget(self.lineEdit3) 25 vbox.addWidget(self.lineEdit4) 26 27 central_widget = QWidget(self) 28 central_widget.setLayout(vbox) 29 self.setCentralWidget(central_widget) 30 31 # イベントをフィルタ (監視) するウィジェットを設定する。 32 self.lineEdit1.installEventFilter(self) 33 self.lineEdit2.installEventFilter(self) 34 self.lineEdit3.installEventFilter(self) 35 36 def eventFilter(self, obj, event): 37 if event.type() == QEvent.FocusIn: 38 # フォーカスが移るイベントが発生した場合、 39 # イベントが発生したオブジェクトの名前をラベルに設定する。 40 self.lineEdit4.setText(obj.objectName()) 41 self.lineEdit4.setFocus() 42 43 return super().eventFilter(obj, event) 44 45 46if __name__ == '__main__': 47 app = QApplication(sys.argv) 48 win = MainWindow() 49 win.show() 50 sys.exit(app.exec_()) 51

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ぱっと見だとフォーカスがlineEdit1~3にフォーカスを移そうとしている最中にlineEdit4にフォーカスを設定するのが強引すぎるかなと思います。

タイマー処理を使ってeventFilterが終わった後にあらためてlineEdit4にフォーカスを設定すればよいのではないかと思います。

Python

1 def eventFilter(self, obj, event): 2 if event.type() == QEvent.FocusIn: 3 # フォーカスが移るイベントが発生した場合、 4 # イベントが発生したオブジェクトの名前をラベルに設定する。 5 self.lineEdit4.setText(obj.objectName()) 6 QTimer.singleShot(0, self.lineEdit4.setFocus) 7 8 return super().eventFilter(obj, event)

QTimer.singleShot(0, self.lineEdit4.setFocus)

を書くことで「eventFilterが終わった後」になるのかが理解できずにいます。

タイマーも「ボタンを押した」、「テキストボックスの内容が変化した」などのイベントの一種です。
eventFilterも「あるテキストボックスにフォーカスが移った」というイベントを契機に呼び出されています。

発生したイベント処理はイベントキューにキューイングされ、app.exec_()の中で順番に処理されています。
何かの関数を実行している最中にいきなり実行されるわけではないんですね。

で、QTimer.singleShot(0, self.lineEdit4.setFocus)ですが経過時間が0なので即座にタイマーイベントが発生します。で、そのイベントは前述のイベントキューに入ります。ただ、今は「あるテキストボックスにフォーカスが移った」を処理中でその瞬間には処理されません。「あるテキストボックスにフォーカスが移った」イベント処理が終わった後にイベントキューにタイマーイベントがあるのでそれが処理されます。

また、QTimerを使わないと「eventFilterが終わった後」の処理を書くことはできないのでしょうか。

わかりません。私の知っている知識ではQTimerだけです。前に説明した通り、何かイベントを発生させて、そのイベント処理としてself.lineEdit4.setFocus()を実行できれば同じことはできるとは思います。

投稿2019/11/30 08:50

編集2019/12/03 10:57
nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WMS

2019/12/03 10:33

nomuken 様 ご回答ありがとうございます。 ご教授頂いたコードで試しましたところ意図した動作をしてくれましたが、 私が書いた self.lineEdit4.setFocus() と同じ位置に QTimer.singleShot(0, self.lineEdit4.setFocus) を書くことで「eventFilterが終わった後」になるのかが理解できずにいます。 また、QTimerを使わないと「eventFilterが終わった後」の処理を書くことはできないのでしょうか。
WMS

2019/12/04 01:18

nomuken 様 ご丁寧な説明ありがとうございます。 「フォーカスが移った」というイベントの中でタイマーイベントが発生、 この影響で 「フォーカスが移った」というイベントが終わり、 新たにタイマーイベントにてフォーカスが移った。 という解釈になったのですが、この解釈で合っているでしょうか。
nomuken

2019/12/04 10:17

> この解釈で合っているでしょうか。 はい。
WMS

2019/12/05 04:19

nomuken 様 ありがとうございます。 やっと理解ができました。色々とご説明頂きましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問