回答編集履歴

5

クリックのコードを追記

2022/02/12 10:33

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -13,9 +13,12 @@
13
13
  アンダーバーを2つにすると、外部から呼び出し際にエラーが出るようにもできます。コードの読みやすさと相談。
14
14
  - ラベル参照用辞書の撤去。Qt のオブジェクト、生成時に親を指定する事で生存サイクルを管理できます。
15
15
  必要があれば、親オブジェクト(ウィジェット) から目的のラベルウィジェットを探索し参照することが可能です。
16
+ - 追記2: ラベルのクリックに対応。イベント通知には Qt ではシグナル・スロットの仕組みを使います。
17
+ イベント自体の処理(マウスの左ボタン判別)と、イベントで起こしたい処理(objectNameを表示)の分離
16
18
 
17
19
 
18
20
  ```python
21
+ from PyQt5.QtCore import Qt, pyqtSignal
19
22
  from PyQt5.QtWidgets import (
20
23
  QApplication,
21
24
  QWidget,
@@ -29,6 +32,15 @@
29
32
  }
30
33
  """
31
34
 
35
+ # ラベルにクリック対応
36
+ # 参考: https://wiki.qt.io/Clickable_QLabel
37
+ class ClickableLabel(QLabel):
38
+ clicked = pyqtSignal()
39
+
40
+ def mousePressEvent(self, event):
41
+ if event.button() == Qt.LeftButton:
42
+ self.clicked.emit()
43
+
32
44
 
33
45
  class LabelTest(QWidget):
34
46
  def __init__(self, *args, **kw):
@@ -36,14 +48,20 @@
36
48
  self._initUI()
37
49
 
38
50
  def _initUI(self):
39
- vbox = QVBoxLayout(self) # 縦(vertical) レイアウト
51
+ vbox = QVBoxLayout(self)
40
- # ※ 画像ファイルは別途準備してください。
41
52
  img = '<img width=16 height=16 src="google-chrome-icon.png">'
42
53
 
43
54
  for num in range(10):
55
+ name = f"Test {num:02}"
44
- label = QLabel(self)
56
+ label = ClickableLabel(self, objectName=name)
45
- label.setText(f"{img} Test {num:02}")
57
+ label.setText(f"{img} {name}")
58
+ label.clicked.connect(self.clicked)
46
59
  vbox.addWidget(label)
60
+
61
+ def clicked(self):
62
+ label = self.sender()
63
+ name = label.objectName()
64
+ print(f"{name} clicked")
47
65
 
48
66
 
49
67
  def main():

4

不要なimport文を削除

2022/02/12 05:37

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  ```python
19
- from PyQt5.QtCore import Qt
20
19
  from PyQt5.QtWidgets import (
21
20
  QApplication,
22
21
  QWidget,

3

補足2

2022/02/12 04:57

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -60,3 +60,9 @@
60
60
  if __name__ == '__main__':
61
61
  main()
62
62
  ```
63
+
64
+
65
+ ----
66
+ 追記: スタイルシートと埋め込みタグにより不要になりますが、
67
+ 質問のコードの改善点について。辞書内のオブジェクトを全て走査してますが、
68
+ 辞書には番号をキーにして、画像・テキストのペアを格納すれば、for 文による走査を省けます。

2

補足

2022/02/12 04:51

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -11,6 +11,9 @@
11
11
  - initUI() -> _initUI() 外部から呼び出さないメソッド名の慣習。
12
12
  メソッド一覧等のドキュメントを生成する際に、プライベートメンバを表示しないように抑制できたりします。
13
13
  アンダーバーを2つにすると、外部から呼び出し際にエラーが出るようにもできます。コードの読みやすさと相談。
14
+ - ラベル参照用辞書の撤去。Qt のオブジェクト、生成時に親を指定する事で生存サイクルを管理できます。
15
+ 必要があれば、親オブジェクト(ウィジェット) から目的のラベルウィジェットを探索し参照することが可能です。
16
+
14
17
 
15
18
  ```python
16
19
  from PyQt5.QtCore import Qt
@@ -29,8 +32,8 @@
29
32
 
30
33
 
31
34
  class LabelTest(QWidget):
32
- def __init__(self, **kw):
35
+ def __init__(self, *args, **kw):
33
- super().__init__(**kw)
36
+ super().__init__(*args, **kw)
34
37
  self._initUI()
35
38
 
36
39
  def _initUI(self):

1

書式の修正

2022/02/12 04:47

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -1,12 +1,16 @@
1
1
  - `import *` は使わない。(理由: PEP8 推奨スタイル)
2
+ デバッグ時に名前空間を見る時、不要な未使用クラスを表示しない。
2
3
  個別に列挙が面倒な場合は、IDEやEditorに支援機能があります。
3
4
  - QLabel で埋め込み画像を使う。簡易タグ表記
4
-  setPixmap を使う場合、画像テキストどちらか片方か表示できませんが、
5
+ setPixmap を使う場合、画像テキストどちらか片方か表示できませんが、
5
-  テキスト内で簡単なタグは使えます。
6
+ テキスト内で簡単なタグは使えます。
6
7
  - スタイルシートを使う。背景色を変更していたイベント処理を省けます
7
-  但し、マウスカーソルの変更などスタイルでは対応していない項目もあるので、
8
+ 但し、マウスカーソルの変更などスタイルでは対応していない項目もあるので、
8
-  全てスタイルシートで済むとは限りません。
9
+ 全てスタイルシートで済むとは限りません。
9
10
  - レイアウトマネージャを使う。→ポジションやサイズ計算
11
+ - initUI() -> _initUI() 外部から呼び出さないメソッド名の慣習。
12
+ メソッド一覧等のドキュメントを生成する際に、プライベートメンバを表示しないように抑制できたりします。
13
+ アンダーバーを2つにすると、外部から呼び出し際にエラーが出るようにもできます。コードの読みやすさと相談。
10
14
 
11
15
  ```python
12
16
  from PyQt5.QtCore import Qt