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

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

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

5873閲覧

Python、Pyqt5でQLineEditで、クリックされたQlineEditのオブジェクト名をラベルに表示したい

WMS

総合スコア37

Python 3.x

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

0グッド

1クリップ

投稿2019/10/14 02:06

編集2019/10/16 02:58

いつもこちらのサイトにはお世話になります。

Python3.7 Pyqt5で作成したlineEditが3つあります。
マウスでクリックした際、下のラベルにクリックされたlineEditのオブジェクト名を表示させたいのですがやり方がわからずにいます。
ご教授お願いいたします。

python

1from PyQt5 import QtCore, QtGui, QtWidgets 2 3class Ui_MainWindow(object): 4 def setupUi(self, MainWindow): 5 MainWindow.setObjectName("MainWindow") 6 MainWindow.resize(256, 267) 7 self.centralwidget = QtWidgets.QWidget(MainWindow) 8 self.centralwidget.setObjectName("centralwidget") 9 self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) 10 self.lineEdit.setGeometry(QtCore.QRect(70, 60, 113, 20)) 11 self.lineEdit.setObjectName("lineEdit") 12 self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) 13 self.lineEdit_2.setGeometry(QtCore.QRect(70, 90, 113, 20)) 14 self.lineEdit_2.setObjectName("lineEdit_2") 15 self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) 16 self.lineEdit_3.setGeometry(QtCore.QRect(70, 120, 113, 20)) 17 self.lineEdit_3.setObjectName("lineEdit_3") 18 self.label = QtWidgets.QLabel(self.centralwidget) 19 self.label.setGeometry(QtCore.QRect(40, 60, 30, 16)) 20 self.label.setObjectName("label") 21 self.label_2 = QtWidgets.QLabel(self.centralwidget) 22 self.label_2.setGeometry(QtCore.QRect(40, 90, 30, 16)) 23 self.label_2.setObjectName("label_2") 24 self.label_3 = QtWidgets.QLabel(self.centralwidget) 25 self.label_3.setGeometry(QtCore.QRect(40, 120, 30, 16)) 26 self.label_3.setObjectName("label_3") 27 self.label_4 = QtWidgets.QLabel(self.centralwidget) 28 self.label_4.setGeometry(QtCore.QRect(40, 150, 170, 30)) 29 font = QtGui.QFont() 30 font.setPointSize(9) 31 self.label_4.setFont(font) 32 self.label_4.setObjectName("label_4") 33 MainWindow.setCentralWidget(self.centralwidget) 34 self.menubar = QtWidgets.QMenuBar(MainWindow) 35 self.menubar.setGeometry(QtCore.QRect(0, 0, 256, 21)) 36 self.menubar.setObjectName("menubar") 37 MainWindow.setMenuBar(self.menubar) 38 self.statusbar = QtWidgets.QStatusBar(MainWindow) 39 self.statusbar.setObjectName("statusbar") 40 MainWindow.setStatusBar(self.statusbar) 41 42 self.retranslateUi(MainWindow) 43 QtCore.QMetaObject.connectSlotsByName(MainWindow) 44 45 def retranslateUi(self, MainWindow): 46 _translate = QtCore.QCoreApplication.translate 47 MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 48 self.label.setText(_translate("MainWindow", "1番")) 49 self.label_2.setText(_translate("MainWindow", "2番")) 50 self.label_3.setText(_translate("MainWindow", "3番")) 51 self.label_4.setText(_translate("MainWindow", "カーソルがあるオブジェクト名を表示")) 52 53 54if __name__ == "__main__": 55 import sys 56 app = QtWidgets.QApplication(sys.argv) 57 MainWindow = QtWidgets.QMainWindow() 58 ui = Ui_MainWindow() 59 ui.setupUi(MainWindow) 60 MainWindow.show() 61 sys.exit(app.exec_()) 62

その後、
ご教授頂いたソースを元にプログラムを修正しましたが
「installEventFilter(self, QObject): argument 1 has unexpected type 'Ui_MainWindow'」
というエラーになり悩んでおります。

https://stackoverflow.com/questions/50768366/installeventfilter-in-pyqt5

色々と調べて上記URLにたどり着き、QtDesignerで作成しているのが原因?
というところまでは何となく把握できたのですが、
どうプログラムを修正したらいいかわからずにいます。
恐れ入ります、今一度ご教授頂けないでしょうか。
以下、修正中のソースになります。

python

1import sys 2from PyQt5 import QtCore, QtGui, QtWidgets 3from PyQt5.QtWidgets import * 4from PyQt5.QtCore import * 5 6class Ui_MainWindow(object): 7 def setupUi(self, MainWindow): 8 MainWindow.setObjectName("MainWindow") 9 MainWindow.resize(256, 267) 10 self.centralwidget = QtWidgets.QWidget(MainWindow) 11 self.centralwidget.setObjectName("centralwidget") 12 self.lineEdit1 = QtWidgets.QLineEdit(self.centralwidget) 13 self.lineEdit1.setGeometry(QtCore.QRect(70, 60, 113, 20)) 14 self.lineEdit1.setObjectName("lineEdit1") 15 self.lineEdit2 = QtWidgets.QLineEdit(self.centralwidget) 16 self.lineEdit2.setGeometry(QtCore.QRect(70, 90, 113, 20)) 17 self.lineEdit2.setObjectName("lineEdit2") 18 self.lineEdit3 = QtWidgets.QLineEdit(self.centralwidget) 19 self.lineEdit3.setGeometry(QtCore.QRect(70, 120, 113, 20)) 20 self.lineEdit3.setObjectName("lineEdit3") 21 self.label = QtWidgets.QLabel(self.centralwidget) 22 self.label.setGeometry(QtCore.QRect(40, 60, 30, 16)) 23 self.label.setObjectName("label") 24 self.label_2 = QtWidgets.QLabel(self.centralwidget) 25 self.label_2.setGeometry(QtCore.QRect(40, 90, 30, 16)) 26 self.label_2.setObjectName("label_2") 27 self.label_3 = QtWidgets.QLabel(self.centralwidget) 28 self.label_3.setGeometry(QtCore.QRect(40, 120, 30, 16)) 29 self.label_3.setObjectName("label_3") 30 self.label_4 = QtWidgets.QLabel(self.centralwidget) 31 self.label_4.setGeometry(QtCore.QRect(40, 150, 170, 30)) 32 font = QtGui.QFont() 33 font.setPointSize(9) 34 self.label_4.setFont(font) 35 self.label_4.setObjectName("label_4") 36 MainWindow.setCentralWidget(self.centralwidget) 37 self.menubar = QtWidgets.QMenuBar(MainWindow) 38 self.menubar.setGeometry(QtCore.QRect(0, 0, 256, 21)) 39 self.menubar.setObjectName("menubar") 40 MainWindow.setMenuBar(self.menubar) 41 self.statusbar = QtWidgets.QStatusBar(MainWindow) 42 self.statusbar.setObjectName("statusbar") 43 MainWindow.setStatusBar(self.statusbar) 44 45 self.retranslateUi(MainWindow) 46 QtCore.QMetaObject.connectSlotsByName(MainWindow) 47 48 # イベントをフィルタ (監視) するウィジェットを設定する。 49 self.lineEdit1.installEventFilter(self) 50 self.lineEdit2.installEventFilter(self) 51 self.lineEdit3.installEventFilter(self) 52 53 def eventFilter(self, obj, event): 54 if event.type() == QEvent.FocusIn: 55 # フォーカスが移るイベントが発生した場合、 56 # イベントが発生したオブジェクトの名前をラベルに設定する。 57 self.label.setText(obj.objectName()) 58 59 return super().eventFilter(obj, event) 60 61 62 def retranslateUi(self, MainWindow): 63 _translate = QtCore.QCoreApplication.translate 64 MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 65 self.label.setText(_translate("MainWindow", "1番")) 66 self.label_2.setText(_translate("MainWindow", "2番")) 67 self.label_3.setText(_translate("MainWindow", "3番")) 68 self.label_4.setText(_translate("MainWindow", "カーソルがあるオブジェクト名を表示")) 69 70 71if __name__ == "__main__": 72 import sys 73 app = QtWidgets.QApplication(sys.argv) 74 MainWindow = QtWidgets.QMainWindow() 75 ui = Ui_MainWindow() 76 ui.setupUi(MainWindow) 77 MainWindow.show() 78 sys.exit(app.exec_())

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答

eventFilter 関数で各 LineEdit にフォーカスが移った際のイベントを拾って、Label にそのオブジェクト名を設定してください。

eventFilter de のっとーり - ヲドリテヒヅル

サンプルコード

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("lineEdit1", self) 13 self.lineEdit1.setObjectName("lineEdit1") 14 self.lineEdit2 = QLineEdit("lineEdit2", self) 15 self.lineEdit2.setObjectName("lineEdit2") 16 self.lineEdit3 = QLineEdit("lineEdit3", self) 17 self.lineEdit3.setObjectName("lineEdit3") 18 self.label = QLabel(self) 19 20 vbox = QVBoxLayout() 21 vbox.addWidget(self.lineEdit1) 22 vbox.addWidget(self.lineEdit2) 23 vbox.addWidget(self.lineEdit3) 24 vbox.addWidget(self.label) 25 26 central_widget = QWidget(self) 27 central_widget.setLayout(vbox) 28 self.setCentralWidget(central_widget) 29 30 # イベントをフィルタ (監視) するウィジェットを設定する。 31 self.lineEdit1.installEventFilter(self) 32 self.lineEdit2.installEventFilter(self) 33 self.lineEdit3.installEventFilter(self) 34 35 def eventFilter(self, obj, event): 36 if event.type() == QEvent.FocusIn: 37 # フォーカスが移るイベントが発生した場合、 38 # イベントが発生したオブジェクトの名前をラベルに設定する。 39 self.label.setText(obj.objectName()) 40 41 return super().eventFilter(obj, event) 42 43if __name__ == '__main__': 44 app = QApplication(sys.argv) 45 win = MainWindow() 46 win.show() 47 sys.exit(app.exec_())

イメージ説明


PyQt5 は Qt (C++) の Python ラッパーで使い方は Qt とほぼ同じなので、PyQt5 の情報を調べる際は、C++ の Qt の情報も参考にするとよいです。

追記

Qt Designer を使う場合は、Python のコードに変換して使うのではなく、PyQt5.uic.loadUi() 関数で .ui ファイルを直接読み込むほうがよいと思います。
Qt Designer で設定した Object Name がそのまま各ウィジェットの変数名になります。


ファイル構成
mainwindow.ui と main.py を同じディレクトリに配置

mainwindow.ui

mainwindow.ui は Qt Designer で生成したもの

python

1<?xml version="1.0" encoding="UTF-8"?> 2<ui version="4.0"> 3 <class>MainWindow</class> 4 <widget class="QMainWindow" name="MainWindow"> 5 <property name="geometry"> 6 <rect> 7 <x>0</x> 8 <y>0</y> 9 <width>189</width> 10 <height>156</height> 11 </rect> 12 </property> 13 <property name="windowTitle"> 14 <string>MainWindow</string> 15 </property> 16 <widget class="QWidget" name="centralwidget"> 17 <layout class="QVBoxLayout" name="verticalLayout"> 18 <item> 19 <widget class="QLineEdit" name="lineEdit1"> 20 <property name="text"> 21 <string>LineEdit1</string> 22 </property> 23 </widget> 24 </item> 25 <item> 26 <widget class="QLineEdit" name="lineEdit2"> 27 <property name="text"> 28 <string>LineEdit2</string> 29 </property> 30 </widget> 31 </item> 32 <item> 33 <widget class="QLineEdit" name="lineEdit3"> 34 <property name="text"> 35 <string>LineEdit3</string> 36 </property> 37 </widget> 38 </item> 39 <item> 40 <widget class="QLabel" name="label"> 41 <property name="text"> 42 <string/> 43 </property> 44 </widget> 45 </item> 46 </layout> 47 </widget> 48 <widget class="QMenuBar" name="menubar"> 49 <property name="geometry"> 50 <rect> 51 <x>0</x> 52 <y>0</y> 53 <width>189</width> 54 <height>20</height> 55 </rect> 56 </property> 57 </widget> 58 <widget class="QStatusBar" name="statusbar"/> 59 </widget> 60 <resources/> 61 <connections/> 62</ui> 63

main.py

python

1import sys 2 3from PyQt5.QtWidgets import * 4from PyQt5.QtCore import * 5from PyQt5 import uic 6 7class MainWindow(QMainWindow): 8 def __init__(self): 9 super().__init__() 10 uic.loadUi('mainwindow.ui', self) 11 12 # イベントをフィルタ (監視) するウィジェットを設定する。 13 self.lineEdit1.installEventFilter(self) 14 self.lineEdit2.installEventFilter(self) 15 self.lineEdit3.installEventFilter(self) 16 17 self.show() 18 19 def eventFilter(self, obj, event): 20 if event.type() == QEvent.FocusIn: 21 # フォーカスが移るイベントが発生した場合、 22 # イベントが発生したオブジェクトの名前をラベルに設定する。 23 self.label.setText(obj.objectName()) 24 25 return super().eventFilter(obj, event) 26 27if __name__ == '__main__': 28 app = QApplication(sys.argv) 29 win = MainWindow() 30 win.show() 31 sys.exit(app.exec_())

投稿2019/10/15 16:21

編集2019/10/16 04:42
tiitoi

総合スコア21956

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

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

WMS

2019/10/16 03:00

tiitoi様 いつもご教授頂きましてありがとうございます。 頂いたソースで実行したところうまく動作したのですが、 私が記載させて頂いたソースに組み込むとエラーとなり動作しません。 追記させて頂きましたので今一度教えて頂ければ幸いです。
tiitoi

2019/10/16 04:44 編集

イベントフィルタを使う場合、QWidget を継承している必要があるので、質問のコードだとそうなっていないためエラーとなっています。 QtDesigner で作成した UI ファイルを Python コードに変換する方法ではなく、回答に追記したように loadUI で読み込んで使うやり方に切り替えたほうがよいと思います。
WMS

2019/10/16 05:37

tiitoi様 素晴らしい!感動しました。 なるほど、loadUI で読み込むことでQWidgetとして継承している、ということになるのですね。 今まではUIファイルをPythonコードに変換していたのですが、見直してみます。 クラスの概念がいまいち理解しておらずフワフワしているので勉強致します。 今回もご教授頂きまして誠にありがとうございました。
tiitoi

2019/10/16 05:43

> QWidgetとして継承している、ということになるのですね。 自作の MainWindow クラスで eventFilter を使用できるのは、QMainWindow を継承しているからです。 QMainWindow は QWidget を継承しているので、結果的に QWidget を継承していることになります。 QWidget --> QMainWindow --> MainWindow (自作のクラス) という継承関係 https://doc.qt.io/qt-5/qmainwindow.html loadUI で UI を読み込むと、その ui ファイルの内容に基づいて、widget が作成されます。 今回、lineEdit1, lineEdit2, lineEdit3, label という名前のウィジェットが *.ui ファイルにあるので、それが自作の MainWindow クラスに追加される感じです。 self.<オブジェクト名> でそのウィジェットにアクセスできます。
WMS

2019/10/16 06:17

なるほどですね。 >QWidget --> QMainWindow --> MainWindow (自作のクラス) という継承関係 この関係を理解していないといけませんね。 理解した上で、loadUI で UI を読み込む。widgetが作られ、自作MainWindow クラスに追加される。 よってself.<オブジェクト名>でwidgetにアクセスすることができるようになる。 すみません、教えて頂いたことを復唱している形になってしまいましたが、繋がりました。 とても分かりやすいです。 今までVBやVBAしか使用してこなかったのでこの手は苦手なのですが、 なんとなく面白さがわかってきました。 ご丁寧に教えて頂きとても感謝致します、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問