質問するログイン新規登録

回答編集履歴

2

サンプルコードの追加

2020/07/10 12:08

投稿

teamikl
teamikl

スコア8824

answer CHANGED
@@ -23,4 +23,67 @@
23
23
  > mainwindowなどでやると動作はしますが、画像が入らないという問題が出てきました。
24
24
 
25
25
  通常のwidgetの場合
26
- QPainter で画像を描画する場合は、drawImage や drawPixmap を使います。
26
+ QPainter で画像を描画する場合は、drawImage や drawPixmap を使います。
27
+
28
+ ----
29
+
30
+ ![イメージ説明](335178bdfbe41a687cd387096148900e.gif)
31
+
32
+ 出典: https://stackoverflow.com/questions/52728462/pyqt-add-rectangle-in-qgraphicsscene
33
+
34
+ サンプルコードを数カ所改変しました。
35
+ - 画像との重ね合わせを考慮して、透過色 QtGui.QColor(255, 0, 0, 128)
36
+ - 短形は一つのみ表示 self.removeItem(self._current_rect_item)
37
+ - 不要な設定の削除 ItemIsMovable フラグ
38
+
39
+ ```python
40
+ from PyQt5 import QtCore, QtGui, QtWidgets
41
+
42
+ class GraphicsScene(QtWidgets.QGraphicsScene):
43
+ def __init__(self, parent=None):
44
+ super(GraphicsScene, self).__init__(QtCore.QRectF(-500, -500, 1000, 1000), parent)
45
+ self._start = QtCore.QPointF()
46
+ self._current_rect_item = None
47
+
48
+ def mousePressEvent(self, event):
49
+ if self._current_rect_item:
50
+ self.removeItem(self._current_rect_item)
51
+ if self.itemAt(event.scenePos(), QtGui.QTransform()) is None:
52
+ self._current_rect_item = QtWidgets.QGraphicsRectItem()
53
+ self._current_rect_item.setBrush(QtGui.QColor(255, 0, 0, 128))
54
+ # アイテムを移動可能にする -> すぐに削除する為不要
55
+ # self._current_rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
56
+ self.addItem(self._current_rect_item)
57
+ self._start = event.scenePos()
58
+ r = QtCore.QRectF(self._start, self._start)
59
+ self._current_rect_item.setRect(r)
60
+ super(GraphicsScene, self).mousePressEvent(event)
61
+
62
+ def mouseMoveEvent(self, event):
63
+ if self._current_rect_item is not None:
64
+ r = QtCore.QRectF(self._start, event.scenePos()).normalized()
65
+ self._current_rect_item.setRect(r)
66
+ super(GraphicsScene, self).mouseMoveEvent(event)
67
+
68
+ def mouseReleaseEvent(self, event):
69
+ # self._current_rect_item = None
70
+ super(GraphicsScene, self).mouseReleaseEvent(event)
71
+
72
+
73
+ class MainWindow(QtWidgets.QMainWindow):
74
+ def __init__(self, parent=None):
75
+ super(MainWindow, self).__init__(parent)
76
+ scene =GraphicsScene(self)
77
+ view = QtWidgets.QGraphicsView(scene)
78
+ self.setCentralWidget(view)
79
+
80
+
81
+ if __name__ == '__main__':
82
+ import sys
83
+
84
+ app = QtWidgets.QApplication(sys.argv)
85
+ w = MainWindow()
86
+ w.resize(640, 480)
87
+ w.show()
88
+ sys.exit(app.exec_())
89
+ ```

1

文章を微修正

2020/07/10 12:08

投稿

teamikl
teamikl

スコア8824

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  QGraphicsView 上の場合、矩形の描画には
18
18
  QGraphicsRectItem等を用います。
19
19
  マウスのイベントでアイテムの表示非表示/移動・リサイズを行うことで
20
- 選択範囲の枠描画は実現できます。
20
+ 選択範囲の枠描画は実現できます。
21
21
 
22
22
  ----
23
23
  > mainwindowなどでやると動作はしますが、画像が入らないという問題が出てきました。