回答編集履歴

4

説明補足

2020/05/23 06:09

投稿

teamikl
teamikl

スコア8664

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

シグナル名・スロット名を本文に合わせて修正

2020/05/23 06:09

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -88,9 +88,9 @@
88
88
 
89
89
  ```diff
90
90
 
91
- --- main.orig.py 2020-05-23 14:47:42.155965200 +0900
91
+ --- main.orig.py 2020-05-23 14:52:14.587404600 +0900
92
-
92
+
93
- +++ main.py 2020-05-23 14:47:21.499922800 +0900
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.onFileSelected.connect(predict.loadImageFile)
123
+ + tools.fileSelected.connect(predict.loadImage)
124
124
 
125
125
  +
126
126
 
@@ -140,7 +140,7 @@
140
140
 
141
141
  +
142
142
 
143
- + onFileSelected = pyqtSignal(str)
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.onFileSelected.emit(fileName)
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,13 @@
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 loadImageFile(self, filename):
197
+ + def loadImage(self, filename):
198
198
 
199
199
  image = QImage()
200
200
 

2

動作確認できたので、コード差分を追記

2020/05/23 05:56

投稿

teamikl
teamikl

スコア8664

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

書式の修正

2020/05/23 05:52

投稿

teamikl
teamikl

スコア8664

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