前提・実現したいこと
PyQt5で画像ラベルとテキストラベルを横に並べ、ペアにしてリストのように表示し、
ラベルペアに対して同じ動作をさせたいと思っております。
具体的には、マウスオーバーしたら色を変え、クリックしたらメッセージを表示する、です。
今回ソースコードのような形で実装したのですが、PyQtを触り始めたばかりで無駄が多いのではないかと思っております。
よりきれいなPyQt向きなコードを教えていただけないでしょうか。
よろしくお願いいたします。
該当のソースコード
python
1from PyQt5.QtWidgets import * 2from PyQt5.QtGui import * 3from PyQt5.QtCore import * 4import sys 5 6class LabelTest(QWidget): 7 def __init__(self): 8 super().__init__() 9 self.initUI() 10 11 def initUI(self): 12 # ラベル参照用辞書 13 self.lbl_dict = dict() 14 15 # 背景色 16 tmpWidget = QWidget() 17 self.backGroundColor = tmpWidget.palette().color(QPalette.Window); 18 19 # 設定 20 icosize = 16 21 width = 120 22 23 for i in range(10): 24 # 画像 25 lblImg = QLabel(self) 26 lblImg.setObjectName(str(i)) 27 lblImg.setText( "●" ) #lblImg.setPixmap( QPixmap("D:\\test.ico") ) #16x16 ico 28 lblImg.installEventFilter(self) 29 lblImg.move(0, i*icosize) 30 lblImg.resize(icosize,icosize) 31 32 # テキスト 33 lblText = QLabel(self) 34 lblText.setObjectName(str(i)) 35 lblText.setText("Text") 36 lblText.installEventFilter(self) 37 lblText.move(icosize, i*icosize) 38 lblText.resize(width-icosize,icosize) 39 40 # ラベルペアを参照用辞書に追加 41 self.lbl_dict.setdefault(str(i), (lblImg,lblText)) 42 43 self.show() 44 45 def eventFilter(self, object, event): 46 # マウスオーバーしたラベルペアを黄色にする 47 if event.type()== QEvent.Enter: 48 for key, value in self.lbl_dict.items(): 49 if object.objectName() == key: 50 img, lbl = value 51 52 palette_yellow = QPalette() 53 palette_yellow.setColor(QPalette.Window, Qt.yellow) 54 55 img.setPalette(palette_yellow) 56 img.setAutoFillBackground(True) 57 lbl.setPalette(palette_yellow) 58 lbl.setAutoFillBackground(True) 59 60 return True 61 62 # マウスアウトしたラベルペアを背景色にする 63 elif event.type()== QEvent.Leave: 64 for key, value in self.lbl_dict.items(): 65 if object.objectName() == key: 66 img, lbl = value 67 68 palette_blue = QPalette() 69 palette_blue.setColor(QPalette.Window, self.backGroundColor ) 70 71 img.setPalette(palette_blue) 72 img.setAutoFillBackground(True) 73 lbl.setPalette(palette_blue) 74 lbl.setAutoFillBackground(True) 75 76 return True 77 78 # クリックしたらメッセージを表示する 79 elif event.type() == QEvent.MouseButtonPress: 80 if event.button() == Qt.LeftButton: 81 print(object.objectName(), "clicked!") 82 return True 83 84 return False 85 86if __name__== '__main__': 87 app= QApplication(sys.argv) 88 ex= LabelTest() 89 sys.exit(app.exec_())
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。