質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

821閲覧

[pyqt5-pyton] mainwindowにcanvasが表示されない

Kenza

総合スコア21

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/23 03:54

編集2020/05/23 03:54

pyqt5-pythonで簡単なお絵描きツールを作っています。
今、mainwindow内に、canvas,predictcanvas,button類(tools)を並列させて、表示させようとしているのですが、なぜかpredictcanvasだけ表示されません。。。

表示できる解決策、よろしくお願いいたします。

以下は実行したコードです

環境:windows10

python

1import sys 2from PyQt5.QtWidgets import ( 3 QWidget, QApplication, QMainWindow, QAction, 4 QFileDialog, QColorDialog, QInputDialog, QPushButton,QHBoxLayout, QVBoxLayout, QApplication) 5from PyQt5.QtGui import QPainter, QImage, QPen, qRgb 6from PyQt5.QtCore import Qt, QPoint, QRect, QSize, QDir 7from collections import deque 8from PyQt5.QtCore import pyqtSlot 9from PyQt5.QtGui import QIcon 10 11class MainWindow(QMainWindow): 12 def __init__(self): 13 super(MainWindow, self).__init__() 14 self.setupUI() 15 self.setCentralWidget(self.initUI()) 16 #クラスを呼び出す。 17 18 def initUI(self): 19 frame = QWidget(self) 20 self.canvas = Canvas(frame) 21 tools = ToolFrame(frame) 22 predict=PredictCanvas(frame) 23 hbox = QHBoxLayout(frame) 24 #vbox=QVBoxLayout() 25 #vbox.addStretch(0) 26 #vbox.addWidget(tools) 27 #vbox.addWidget(predict) 28 hbox.addWidget(self.canvas) 29 hbox.addWidget(predict) 30 hbox.addWidget(tools) 31 return frame 32 33 def setupUI(self): 34 menubar = self.menuBar() 35 36 openAct = QAction('&Open', self) 37 openAct.setShortcut('Ctrl+O') 38 openAct.triggered.connect(self.openFile) 39 40 exitAct = QAction('&Exit', self) 41 exitAct.setShortcut('Ctrl+Q') 42 exitAct.triggered.connect(self.close) 43 44 saveAct = QAction('&Save', self) 45 saveAct.setShortcut('Ctrl+S') 46 saveAct.triggered.connect(self.saveFile) 47 48 fileMenu = menubar.addMenu('&File') 49 #fileMenu.addAction(resetAct) 50 fileMenu.addAction(openAct) 51 fileMenu.addAction(saveAct) 52 fileMenu.addAction(exitAct) 53 54 # 画像付き Pencolor selectするアクションオブジェクト作成 55 selectColorAction = QAction( QIcon('sample/white-bear.png'),'Pen Color', self) 56 selectColorAction.setShortcut('Ctrl+A') 57 selectColorAction.triggered.connect(self.selectColor) 58 self.toolbar = self.addToolBar('Pen Color') 59 self.toolbar.addAction(selectColorAction) 60 61 # ツールバー作成 62 selectwidthAction = QAction( QIcon('sample/white-bear.png'),'Selecwidth', self) 63 selectwidthAction.triggered.connect(self.selectWidth) 64 self.toolbar = self.addToolBar('Width') 65 self.toolbar.addAction(selectwidthAction) 66 67 # ツールバー作成 68 backAction = QAction( QIcon('sample/white-bear.png'),'Back', self) 69 backAction.setShortcut('Ctrl+Z') 70 backAction.triggered.connect(self.on_back) 71 self.toolbar = self.addToolBar('Undo') 72 self.toolbar.addAction(backAction) 73 74 # ツールバー作成 75 clearAction = QAction( QIcon('sample/white-bear.png'),'Clear', self) 76 clearAction.setShortcut('Ctrl+B') 77 clearAction.triggered.connect(self.on_reset) 78 self.toolbar = self.addToolBar('Undo') 79 self.toolbar.addAction(clearAction) 80 81 @pyqtSlot() 82 def on_back(self): 83 print('PyQt5 button click') 84 self.canvas.backImage() 85 86 @pyqtSlot() 87 def on_reset(self): 88 self.canvas.resetImage() 89 90 @pyqtSlot() 91 def on_run(self): 92 fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) 93 94 if fileName: 95 self.predict_canvas.PredictImage(fileName) 96 #self.canvas.openImage(fileName) 97 98 def selectColor(self): 99 newColor = QColorDialog.getColor(self.canvas.penColor()) 100 self.canvas.setPenColor(newColor) 101 102 def selectWidth(self): 103 newWidth, ok = QInputDialog.getInt( 104 self, "select", 105 "select pen width: ", self.canvas.penWidth(), 1, 100, 1) 106 if ok: 107 self.canvas.setPenWidth(newWidth) 108 109 def openFile(self): 110 fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) 111 if fileName: 112 self.canvas.openImage(fileName) 113 114 def saveFile(self): 115 path = QDir.currentPath() 116 print(path) 117 fileName, _ = QFileDialog.getSaveFileName(self, "Save as",path) 118 fileName=fileName+'.png' 119 if fileName: 120 print(fileName) 121 return self.canvas.saveImage(fileName) 122 else: 123 print("you couldnt save the file") 124 return False 125 126class ToolFrame(QWidget): 127 def __init__(self, parent=None, *args, **kw): 128 super().__init__(parent, *args, **kw) 129 self.predict=PredictCanvas() 130 self.initUI() 131 132 def initUI(self): 133 button_predict = QPushButton('predict', self) 134 button_predict.clicked.connect(self.on_run) 135 136 137 button_reset = QPushButton('Reset', self) 138 139 vbox = QVBoxLayout(self) 140 vbox.addStretch(1) 141 vbox.addWidget(button_predict) 142 vbox.addWidget(button_reset) 143 144 @pyqtSlot() 145 def on_run(self): 146 fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) 147 148 if fileName: 149 self.predict.PredictImage(fileName) 150 #self.canvas.openImage(fileName) 151 152class Canvas(QWidget): 153 def __init__(self, parent = None): 154 super(Canvas, self).__init__(parent) 155 156 self.myPenWidth = 2 157 self.myPenColor = Qt.black 158 self.image = QImage() 159 self.check = False 160 self.back = deque(maxlen = 10) 161 self.image = QImage(300, 300, QImage.Format_RGB32) 162 self.image.fill(qRgb(255, 255, 255)) 163 #self.next = deque(maxlen = 10) 164 # initUIはもう必要ないから消しておこうね 165 166 167 def mousePressEvent(self, event): 168 if event.button() == Qt.LeftButton: 169 self.back.append(self.resizeImage(self.image, self.image.size())) 170 self.lastPos = event.pos() 171 self.check = True 172 173 def mouseMoveEvent(self, event): 174 if event.buttons() and Qt.LeftButton and self.check: 175 self.drawLine(event.pos()) 176 177 def mouseReleaseEvent(self, event): 178 if event.button() == Qt.LeftButton and self.check: 179 self.drawLine(event.pos()) 180 self.check = False 181 182 def drawLine(self, endPos): 183 painter = QPainter(self.image) 184 painter.setPen( 185 QPen(self.myPenColor, self.myPenWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin) 186 ) 187 painter.drawLine(self.lastPos, endPos) 188 self.update() 189 self.lastPos = QPoint(endPos) 190 191 def paintEvent(self, event): 192 painter = QPainter(self) 193 rect = event.rect() 194 painter.drawImage(rect, self.image, rect) 195 196 def resizeEvent(self, event): 197 if self.image.width() < self.width() or self.image.height() < self.height(): 198 changeWidth = max(self.width(), self.image.width()) 199 changeHeight = max(self.height(), self.image.height()) 200 self.image = self.resizeImage(self.image, QSize(changeWidth, changeHeight)) 201 self.update() 202 203 def resizeImage(self, image, newSize): 204 changeImage = QImage(newSize, QImage.Format_RGB32) 205 changeImage.fill(qRgb(255, 255, 255)) 206 painter = QPainter(changeImage) 207 painter.drawImage(QPoint(0, 0), image) 208 return changeImage 209 210 def saveImage(self, filename): 211 if self.image.save(filename): 212 return True 213 else: 214 return False 215 216 def openImage(self, filename): 217 image = QImage() 218 if not image.load(filename): 219 return False 220 221 self.image = image 222 self.update() 223 return True 224 225 def penColor(self): 226 return self.myPenColor 227 228 def penWidth(self): 229 return self.myPenWidth 230 231 def setPenColor(self, newColor): 232 self.myPenColor = newColor 233 234 def setPenWidth(self, newWidth): 235 self.myPenWidth = newWidth 236 237 def resetImage(self): 238 self.image.fill(qRgb(255, 255, 255)) 239 self.update() 240 241 def backImage(self): 242 if self.back: 243 back_ = self.back.pop() 244 #self.next.append(back_) 245 self.image = QImage(back_) 246 self.update() 247 248 249class PredictCanvas(QWidget): 250 def __init__(self, parent = None): 251 super(PredictCanvas, self).__init__(parent) 252 253 self.image_predict = QImage() 254 self.image_predict.fill(qRgb(255, 0, 255)) 255 256 def PredictImage(self, filename): 257 image = QImage() 258 if not image.load(filename): 259 return False 260 261 self.image_predict = image 262 self.update() 263 return True 264 265def main(): 266 app = QApplication(sys.argv) 267 ex = MainWindow() 268 ex.setWindowTitle('Paint Tools') 269 ex.setGeometry(50, 50, 1400, 800) 270 ex.show() 271 sys.exit(app.exec_()) 272 273if __name__ == '__main__': 274 main() 275

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なぜかpredictcanvasだけ表示されません

複数の問題があります

  • predictcanvas が表示されない (画面中央の領域)

 paintEvent がない

  • 読み込んだ画像が反映されない (ファイル選択時のイベント)

 ToolFrame 内で別の PredictCanvas() を生成?


まず、表示されていますが、表示するものが何もない状態です。

  • QImageを準備しているが、サイズが 0
  • QImageは準備されただけで、何処にも描画されてない

 Canvas クラスと同様に paintEvent メソッドを実装しましょう。


次に、ファイルを選択したときの挙動ですが

画面中央に表示されているのは、MainWindowのpredict
ToolFrameのon_run()で呼び出しているのは、
ToolFrame内で生成されたPredictCanvas()と、それぞれ異なるものです。

メインウィンドウ側のpredict canvas のメソッドを呼び出すことで
問題自体は解決できますが、親ウィジェットを辿ってアクセスするのは、
クラスの利便性を損なうので、あまりお勧めしません。

Qtのシグナル/スロットを使った解消法を提案

  • (1) ToolFrame でファイル選択時のシグナルを定義します

 fileSelected = pyqtSignal(str)

  • (2) PredictCanvas 側で、ファイルを読み込むスロットを定義します

 @pyqtSlot ... def loadImage(self, filename)

  • (3) MainWindow で双方を接続する

 tools.fileSelected.connect(predict.loadImage)

  • (4) シグナル発火

 ToolFrame.on_run メソッド内 で self.fileSelected.emit(filename) 

PyQt5 でのシグナル/スロットの使い方は
PyQt5 signals_slots 等を参考に、コードの書き方は調べて下さい。

追記:

因みに、pyqtではスロットの宣言は省略可能で、引数さえ一致すればよく
例えば、Canva.openImage にも connect することができます。

tools.fileSelected.connect(self.canvas.openImage)

ToolFrame.on_runから親にアクセス
self.parent().predict.loadImage(fileName) みたいなコードは、
MainWindowに依存したコードになり、クラス・オブジェクトの構造が変わると使えなくなりますが、
シグナル・スロットを用いることで、利用側が振る舞いを決められるようになり、
ウィジェットの部品としての再利用性が高まります。


diff

1--- main.orig.py 2020-05-23 14:52:14.587404600 +0900 2+++ main.py 2020-05-23 14:55:03.595347700 +0900 3@@ -5,7 +5,7 @@ 4 from PyQt5.QtGui import QPainter, QImage, QPen, qRgb 5 from PyQt5.QtCore import Qt, QPoint, QRect, QSize, QDir 6 from collections import deque 7-from PyQt5.QtCore import pyqtSlot 8+from PyQt5.QtCore import pyqtSlot, pyqtSignal 9 from PyQt5.QtGui import QIcon 10 11 class MainWindow(QMainWindow): 12@@ -28,6 +28,9 @@ 13 hbox.addWidget(self.canvas) 14 hbox.addWidget(predict) 15 hbox.addWidget(tools) 16+ 17+ tools.fileSelected.connect(predict.loadImage) 18+ 19 return frame 20 21 def setupUI(self): 22@@ -124,9 +127,11 @@ 23 return False 24 25 class ToolFrame(QWidget): 26+ 27+ fileSelected = pyqtSignal(str) 28+ 29 def __init__(self, parent=None, *args, **kw): 30 super().__init__(parent, *args, **kw) 31- self.predict=PredictCanvas() 32 self.initUI() 33 34 def initUI(self): 35@@ -146,7 +151,7 @@ 36 fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) 37 38 if fileName: 39- self.predict.PredictImage(fileName) 40+ self.fileSelected.emit(fileName) 41 #self.canvas.openImage(fileName) 42 43 class Canvas(QWidget): 44@@ -253,7 +258,12 @@ 45 self.image_predict = QImage() 46 self.image_predict.fill(qRgb(255, 0, 255)) 47 48- def PredictImage(self, filename): 49+ def paintEvent(self, event): 50+ painter = QPainter(self) 51+ painter.drawImage(0, 0, self.image_predict) 52+ 53+ @pyqtSlot(str) 54+ def loadImage(self, filename): 55 image = QImage() 56 if not image.load(filename): 57 return False 58

投稿2020/05/23 05:39

編集2020/05/23 06:09
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

※投稿後追記:
動くコードにはなっていますが、当方の知識不足の点が多々あると思います。上のteamiklさんの回答の方が正確なため、teamiklさんの回答&コードを参考にしてください。

① 削除
② PredictCanvasで下記のようにpaintEventを実装してあげないと、描画更新されません。

def paintEvent(self, event): painter = QPainter(self) rect = event.rect() painter.drawImage(rect, self.image_predict, rect)

③ 元コードでは、ToolFrame(QWidget)で新たにPredictCanvasが生成されてしまっており、メインウィジェットのpredict(predict_canvas)が共有されていません。

下記のように、メインウィジェットのpredict_canvasをToolFrame(QWidget)が受け取れるように修正する必要があります。

呼び出し元

def initUI(self): frame = QWidget(self) self.canvas = Canvas(frame) self.predict_canvas = PredictCanvas(frame) tools = ToolFrame(frame, canvas=self.predict_canvas) #修正部分 メインウィジェットのpredict_canvsを引数として呼び出す。

呼び出し先

class ToolFrame(QWidget): def __init__(self, parent=None, canvas = None): 修正 super().__init__(parent) self.predict = canvas # 修正 メインウィジェットのpredict_canvasを受け取る self.initUI()

以上をまとめた全体コードが、下記のコードです。

import sys from PyQt5.QtWidgets import ( QWidget, QApplication, QMainWindow, QAction, QFileDialog, QColorDialog, QInputDialog, QPushButton,QHBoxLayout, QVBoxLayout, QApplication) from PyQt5.QtGui import QPainter, QImage, QPen, qRgb from PyQt5.QtCore import Qt, QPoint, QRect, QSize, QDir from collections import deque from PyQt5.QtCore import pyqtSlot from PyQt5.QtGui import QIcon class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setupUI() self.setCentralWidget(self.initUI()) #クラスを呼び出す。 def initUI(self): frame = QWidget(self) self.canvas = Canvas(frame) self.predict_canvas = PredictCanvas(frame) tools = ToolFrame(frame, canvas=self.predict_canvas) hbox = QHBoxLayout(frame) #vbox=QVBoxLayout() #vbox.addStretch(0) #vbox.addWidget(tools) #vbox.addWidget(predict) hbox.addWidget(self.canvas) hbox.addWidget(self.predict_canvas) hbox.addWidget(tools) # frame.setLayout(hbox) # 9行目前でQHBoxLayout(frame)というように親を指定しているため不要 return frame def setupUI(self): menubar = self.menuBar() openAct = QAction('&Open', self) openAct.setShortcut('Ctrl+O') openAct.triggered.connect(self.openFile) exitAct = QAction('&Exit', self) exitAct.setShortcut('Ctrl+Q') exitAct.triggered.connect(self.close) saveAct = QAction('&Save', self) saveAct.setShortcut('Ctrl+S') saveAct.triggered.connect(self.saveFile) fileMenu = menubar.addMenu('&File') #fileMenu.addAction(resetAct) fileMenu.addAction(openAct) fileMenu.addAction(saveAct) fileMenu.addAction(exitAct) # 画像付き Pencolor selectするアクションオブジェクト作成 selectColorAction = QAction( QIcon('sample/white-bear.png'),'Pen Color', self) selectColorAction.setShortcut('Ctrl+A') selectColorAction.triggered.connect(self.selectColor) self.toolbar = self.addToolBar('Pen Color') self.toolbar.addAction(selectColorAction) # ツールバー作成 selectwidthAction = QAction( QIcon('sample/white-bear.png'),'Selecwidth', self) selectwidthAction.triggered.connect(self.selectWidth) self.toolbar = self.addToolBar('Width') self.toolbar.addAction(selectwidthAction) # ツールバー作成 backAction = QAction( QIcon('sample/white-bear.png'),'Back', self) backAction.setShortcut('Ctrl+Z') backAction.triggered.connect(self.on_back) self.toolbar = self.addToolBar('Undo') self.toolbar.addAction(backAction) # ツールバー作成 clearAction = QAction( QIcon('sample/white-bear.png'),'Clear', self) clearAction.setShortcut('Ctrl+B') clearAction.triggered.connect(self.on_reset) self.toolbar = self.addToolBar('Undo') self.toolbar.addAction(clearAction) @pyqtSlot() def on_back(self): print('PyQt5 button click') self.canvas.backImage() @pyqtSlot() def on_reset(self): self.canvas.resetImage() @pyqtSlot() def on_run(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) if fileName: self.predict_canvas.PredictImage(fileName) #self.canvas.openImage(fileName) def selectColor(self): newColor = QColorDialog.getColor(self.canvas.penColor()) self.canvas.setPenColor(newColor) def selectWidth(self): newWidth, ok = QInputDialog.getInt( self, "select", "select pen width: ", self.canvas.penWidth(), 1, 100, 1) if ok: self.canvas.setPenWidth(newWidth) def openFile(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) if fileName: self.predict_canvas.PredictImage(fileName) def saveFile(self): path = QDir.currentPath() print(path) fileName, _ = QFileDialog.getSaveFileName(self, "Save as",path) fileName=fileName+'.png' if fileName: print(fileName) return self.canvas.saveImage(fileName) else: print("you couldnt save the file") return False class ToolFrame(QWidget): def __init__(self, parent=None, canvas = None): super().__init__(parent) self.predict = canvas # PredictCanvas() self.initUI() def initUI(self): button_predict = QPushButton('predict', self) button_predict.clicked.connect(self.on_run) button_reset = QPushButton('Reset', self) vbox = QVBoxLayout(self) vbox.addStretch(1) vbox.addWidget(button_predict) vbox.addWidget(button_reset) @pyqtSlot() def on_run(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) if fileName: self.predict.PredictImage(fileName) #self.canvas.openImage(fileName) class Canvas(QWidget): def __init__(self, parent = None): super(Canvas, self).__init__(parent) self.myPenWidth = 2 self.myPenColor = Qt.black self.image = QImage() self.check = False self.back = deque(maxlen = 10) self.image = QImage(300, 300, QImage.Format_RGB32) self.image.fill(qRgb(255, 255, 255)) #self.next = deque(maxlen = 10) # initUIはもう必要ないから消しておこうね def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.back.append(self.resizeImage(self.image, self.image.size())) self.lastPos = event.pos() self.check = True def mouseMoveEvent(self, event): if event.buttons() and Qt.LeftButton and self.check: self.drawLine(event.pos()) def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton and self.check: self.drawLine(event.pos()) self.check = False def drawLine(self, endPos): painter = QPainter(self.image) painter.setPen( QPen(self.myPenColor, self.myPenWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin) ) painter.drawLine(self.lastPos, endPos) self.update() self.lastPos = QPoint(endPos) def paintEvent(self, event): painter = QPainter(self) rect = event.rect() painter.drawImage(rect, self.image, rect) def resizeEvent(self, event): if self.image.width() < self.width() or self.image.height() < self.height(): changeWidth = max(self.width(), self.image.width()) changeHeight = max(self.height(), self.image.height()) self.image = self.resizeImage(self.image, QSize(changeWidth, changeHeight)) self.update() def resizeImage(self, image, newSize): changeImage = QImage(newSize, QImage.Format_RGB32) changeImage.fill(qRgb(255, 255, 255)) painter = QPainter(changeImage) painter.drawImage(QPoint(0, 0), image) return changeImage def saveImage(self, filename): if self.image.save(filename): return True else: return False def openImage(self, filename): image = QImage() if not image.load(filename): return False self.image = image self.update() return True def penColor(self): return self.myPenColor def penWidth(self): return self.myPenWidth def setPenColor(self, newColor): self.myPenColor = newColor def setPenWidth(self, newWidth): self.myPenWidth = newWidth def resetImage(self): self.image.fill(qRgb(255, 255, 255)) self.update() def backImage(self): if self.back: back_ = self.back.pop() #self.next.append(back_) self.image = QImage(back_) self.update() # teratail 264079 modified by taizan-hokuto class PredictCanvas(QWidget): def __init__(self, parent = None): super(PredictCanvas, self).__init__(parent) self.image_predict = QImage() self.image_predict.fill(qRgb(255, 0, 255)) def PredictImage(self, filename): image = QImage() if not image.load(filename): return False self.image_predict = image self.update() return True def paintEvent(self, event): painter = QPainter(self) rect = event.rect() painter.drawImage(rect, self.image_predict, rect) def main(): app = QApplication(sys.argv) ex = MainWindow() ex.setWindowTitle('Paint Tools') ex.setGeometry(50, 50, 1400, 800) ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()

投稿2020/05/23 06:10

編集2020/05/23 06:46
patapi

総合スコア667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2020/05/23 06:36

(1) については qt layoutの基底クラスで親が与えられたときに setLayout が呼ばれるようになってます。 Pythonだから明示した方がいいみたいな観点はありますが、 前の回答で私が、親を与えると setLayout を省略できますと書いた為で、 今回の表示問題への影響はないと思います。 hbox = QHBoxLayout(frame) print(frame.layout() == hbox) # => Trueになります frame.setLayout(hbox) ---- 参考: ドキュメント (QWidget::setLayout) https://doc.qt.io/qt-5/qwidget.html#setLayout > An alternative to calling this function is to pass this widget to the layout's constructor. 実装箇所 (QLayoutコンストラクタ) https://code.woboq.org/qt5/qtbase/src/widgets/kernel/qlayout.cpp.html#123
patapi

2020/05/23 06:42 編集

補足ありがとうございます。こちらの知識不足でした。 私が書いたのは誤った情報であったため、修正しておきます。
teamikl

2020/05/23 07:16

何処かで読んだ記憶があるんだけど、何処だっただろうと QLayout側の説明には書かれてなくて、焦って調べ直しました。 (C++での仕様と PyQt5 で違ってた可能性もあったので) --- 2つ目の問題についてはアプローチは異なりますが 私のシグナル~スロット云々については、若干、改善案的な面もあり、 シグナルの導入がハードルになるかもと、後々思い返すこともあったり… 問題自体の焦点は「predictが共有されてない事」と同じなので、 全体をまとめられた、そのまま動くコードは参考になると思います。
Kenza

2020/05/23 11:57 編集

お二方ともありがとうございました。 taizan205様の回答は具体的且つ明示的で非常にわかりやすかったですが、 今回はより勉強になったという点でteamikl様を選ばせていただきました 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問