回答編集履歴
4
説明補足
test
CHANGED
@@ -70,9 +70,7 @@
|
|
70
70
|
|
71
71
|
- (4) シグナル発火
|
72
72
|
|
73
|
-
ToolFrame.on_run メソッド内 で `self.fileSelected.emit(filename)`
|
73
|
+
ToolFrame.on_run メソッド内 で `self.fileSelected.emit(filename)`
|
74
|
-
|
75
|
-
|
76
74
|
|
77
75
|
|
78
76
|
|
@@ -82,6 +80,32 @@
|
|
82
80
|
|
83
81
|
|
84
82
|
|
83
|
+
追記:
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
因みに、pyqtではスロットの宣言は省略可能で、引数さえ一致すればよく
|
88
|
+
|
89
|
+
例えば、Canva.openImage にも connect することができます。
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
`tools.fileSelected.connect(self.canvas.openImage)`
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
ToolFrame.on_runから親にアクセス
|
98
|
+
|
99
|
+
self.parent().predict.loadImage(fileName) みたいなコードは、
|
100
|
+
|
101
|
+
MainWindowに依存したコードになり、クラス・オブジェクトの構造が変わると使えなくなりますが、
|
102
|
+
|
103
|
+
シグナル・スロットを用いることで、利用側が振る舞いを決められるようになり、
|
104
|
+
|
105
|
+
ウィジェットの部品としての再利用性が高まります。
|
106
|
+
|
107
|
+
|
108
|
+
|
85
109
|
----
|
86
110
|
|
87
111
|
|
3
シグナル名・スロット名を本文に合わせて修正
test
CHANGED
@@ -88,9 +88,9 @@
|
|
88
88
|
|
89
89
|
```diff
|
90
90
|
|
91
|
-
--- main.orig.py 2020-05-23 14:
|
91
|
+
--- main.orig.py 2020-05-23 14:52:14.587404600 +0900
|
92
|
-
|
92
|
+
|
93
|
-
+++ main.py 2020-05-23 14:
|
93
|
+
+++ main.py 2020-05-23 14:55:03.595347700 +0900
|
94
94
|
|
95
95
|
@@ -5,7 +5,7 @@
|
96
96
|
|
@@ -120,7 +120,7 @@
|
|
120
120
|
|
121
121
|
+
|
122
122
|
|
123
|
-
+ tools.
|
123
|
+
+ tools.fileSelected.connect(predict.loadImage)
|
124
124
|
|
125
125
|
+
|
126
126
|
|
@@ -140,7 +140,7 @@
|
|
140
140
|
|
141
141
|
+
|
142
142
|
|
143
|
-
+
|
143
|
+
+ fileSelected = pyqtSignal(str)
|
144
144
|
|
145
145
|
+
|
146
146
|
|
@@ -166,7 +166,7 @@
|
|
166
166
|
|
167
167
|
- self.predict.PredictImage(fileName)
|
168
168
|
|
169
|
-
+ self.
|
169
|
+
+ self.fileSelected.emit(fileName)
|
170
170
|
|
171
171
|
#self.canvas.openImage(fileName)
|
172
172
|
|
@@ -174,7 +174,7 @@
|
|
174
174
|
|
175
175
|
class Canvas(QWidget):
|
176
176
|
|
177
|
-
@@ -253,7 +258,1
|
177
|
+
@@ -253,7 +258,12 @@
|
178
178
|
|
179
179
|
self.image_predict = QImage()
|
180
180
|
|
@@ -194,7 +194,7 @@
|
|
194
194
|
|
195
195
|
+ @pyqtSlot(str)
|
196
196
|
|
197
|
-
+ def loadImage
|
197
|
+
+ def loadImage(self, filename):
|
198
198
|
|
199
199
|
image = QImage()
|
200
200
|
|
2
動作確認できたので、コード差分を追記
test
CHANGED
@@ -79,3 +79,129 @@
|
|
79
79
|
PyQt5 でのシグナル/スロットの使い方は
|
80
80
|
|
81
81
|
[PyQt5 signals_slots](https://doc.bccnsoft.com/docs/PyQt5/signals_slots.html) 等を参考に、コードの書き方は調べて下さい。
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
----
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
```diff
|
90
|
+
|
91
|
+
--- main.orig.py 2020-05-23 14:47:42.155965200 +0900
|
92
|
+
|
93
|
+
+++ main.py 2020-05-23 14:47:21.499922800 +0900
|
94
|
+
|
95
|
+
@@ -5,7 +5,7 @@
|
96
|
+
|
97
|
+
from PyQt5.QtGui import QPainter, QImage, QPen, qRgb
|
98
|
+
|
99
|
+
from PyQt5.QtCore import Qt, QPoint, QRect, QSize, QDir
|
100
|
+
|
101
|
+
from collections import deque
|
102
|
+
|
103
|
+
-from PyQt5.QtCore import pyqtSlot
|
104
|
+
|
105
|
+
+from PyQt5.QtCore import pyqtSlot, pyqtSignal
|
106
|
+
|
107
|
+
from PyQt5.QtGui import QIcon
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
class MainWindow(QMainWindow):
|
112
|
+
|
113
|
+
@@ -28,6 +28,9 @@
|
114
|
+
|
115
|
+
hbox.addWidget(self.canvas)
|
116
|
+
|
117
|
+
hbox.addWidget(predict)
|
118
|
+
|
119
|
+
hbox.addWidget(tools)
|
120
|
+
|
121
|
+
+
|
122
|
+
|
123
|
+
+ tools.onFileSelected.connect(predict.loadImageFile)
|
124
|
+
|
125
|
+
+
|
126
|
+
|
127
|
+
return frame
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
def setupUI(self):
|
132
|
+
|
133
|
+
@@ -124,9 +127,11 @@
|
134
|
+
|
135
|
+
return False
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
class ToolFrame(QWidget):
|
140
|
+
|
141
|
+
+
|
142
|
+
|
143
|
+
+ onFileSelected = pyqtSignal(str)
|
144
|
+
|
145
|
+
+
|
146
|
+
|
147
|
+
def __init__(self, parent=None, *args, **kw):
|
148
|
+
|
149
|
+
super().__init__(parent, *args, **kw)
|
150
|
+
|
151
|
+
- self.predict=PredictCanvas()
|
152
|
+
|
153
|
+
self.initUI()
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
def initUI(self):
|
158
|
+
|
159
|
+
@@ -146,7 +151,7 @@
|
160
|
+
|
161
|
+
fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath())
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
if fileName:
|
166
|
+
|
167
|
+
- self.predict.PredictImage(fileName)
|
168
|
+
|
169
|
+
+ self.onFileSelected.emit(fileName)
|
170
|
+
|
171
|
+
#self.canvas.openImage(fileName)
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
class Canvas(QWidget):
|
176
|
+
|
177
|
+
@@ -253,7 +258,13 @@
|
178
|
+
|
179
|
+
self.image_predict = QImage()
|
180
|
+
|
181
|
+
self.image_predict.fill(qRgb(255, 0, 255))
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
- def PredictImage(self, filename):
|
186
|
+
|
187
|
+
+ def paintEvent(self, event):
|
188
|
+
|
189
|
+
+ painter = QPainter(self)
|
190
|
+
|
191
|
+
+ painter.drawImage(0, 0, self.image_predict)
|
192
|
+
|
193
|
+
+
|
194
|
+
|
195
|
+
+ @pyqtSlot(str)
|
196
|
+
|
197
|
+
+ def loadImageFile(self, filename):
|
198
|
+
|
199
|
+
image = QImage()
|
200
|
+
|
201
|
+
if not image.load(filename):
|
202
|
+
|
203
|
+
return False
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
```
|
1
書式の修正
test
CHANGED
@@ -58,11 +58,11 @@
|
|
58
58
|
|
59
59
|
- (1) ToolFrame でファイル選択時のシグナルを定義します
|
60
60
|
|
61
|
-
fileSelected = pyqtSignal(str)
|
61
|
+
`fileSelected = pyqtSignal(str)`
|
62
62
|
|
63
63
|
- (2) PredictCanvas 側で、ファイルを読み込むスロットを定義します
|
64
64
|
|
65
|
-
@pyqtSlot ... def loadImage(self, filename)
|
65
|
+
`@pyqtSlot` ... `def loadImage(self, filename)`
|
66
66
|
|
67
67
|
- (3) MainWindow で双方を接続する
|
68
68
|
|
@@ -70,7 +70,7 @@
|
|
70
70
|
|
71
71
|
- (4) シグナル発火
|
72
72
|
|
73
|
-
ToolFrame.on_run メソッド内 で self.fileSelected.emit(filename)
|
73
|
+
ToolFrame.on_run メソッド内 で `self.fileSelected.emit(filename)`
|
74
74
|
|
75
75
|
|
76
76
|
|