回答編集履歴
5
クリックのコードを追記
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)
|
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 =
|
56
|
+
label = ClickableLabel(self, objectName=name)
|
45
|
-
label.setText(f"{img}
|
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文を削除
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
test
CHANGED
@@ -60,3 +60,9 @@
|
|
60
60
|
if __name__ == '__main__':
|
61
61
|
main()
|
62
62
|
```
|
63
|
+
|
64
|
+
|
65
|
+
----
|
66
|
+
追記: スタイルシートと埋め込みタグにより不要になりますが、
|
67
|
+
質問のコードの改善点について。辞書内のオブジェクトを全て走査してますが、
|
68
|
+
辞書には番号をキーにして、画像・テキストのペアを格納すれば、for 文による走査を省けます。
|
2
補足
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
書式の修正
test
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
- `import *` は使わない。(理由: PEP8 推奨スタイル)
|
2
|
+
デバッグ時に名前空間を見る時、不要な未使用クラスを表示しない。
|
2
3
|
個別に列挙が面倒な場合は、IDEやEditorに支援機能があります。
|
3
4
|
- QLabel で埋め込み画像を使う。簡易タグ表記
|
4
|
-
|
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
|