Как отрисовать прямоугольник посредством протягивания зажатой левой кнопки мыши на scene до ее разжатия?
Как нарисовать прямоугольник с помощью протягивания зажатой левой кнопки мыши (ЛКМ) до ее разжатия (с изменением размера) ?
В моей программе прямоугольники рисуются просто с помощью нажатия ЛКМ по scene.
Принцип работы:
- Нажимаем левой кнопкой мыши по области
sceneи не отпускаем ее:
- Протягивая зажатую кнопку мыши, наш прямоугольник постепенно появляется.
- Разжимаем кнопку мыши чтобы построить прямоугольник (в конечной точке - разжимаем левую кнопку мыши)
код:
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class GraphicsScene(QGraphicsScene):
clicked = pyqtSignal(QPointF)
def mousePressEvent(self, event):
sp = event.scenePos()
self.clicked.emit(sp)
super().mousePressEvent(event)
class Editor(QMainWindow):
def __init__(self):
super().__init__()
self.resize(520, 550)
self.grview = QGraphicsView()
self.grview.scale(1, -1)
self.scene = GraphicsScene()
self.setMouseTracking(True)
self.scene.setSceneRect(-250, -250, 500, 500)
self.grview.setScene(self.scene)
self.pen = QPen(Qt.red)
self.brush = QBrush(Qt.green)
self.scene.clicked.connect(self.handle_clicked)
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
layout = QVBoxLayout(self.centralWidget)
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.grview)
self.show()
def mousePressEvent(self, event):
rect = self.scene.addRect(self.x, self.y, 100, 100, self.pen, self.brush)
rect.setFlag(QGraphicsItem.ItemIsMovable)
super(Editor, self).mousePressEvent(event)
def handle_clicked(self, p):
self.x = p.x()
self.y = p.y()
print(self.x)
def main():
app = QtWidgets.QApplication(sys.argv)
g = Editor()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Что-то нарисовал, проверьте.
import sys
from PyQt5.Qt import *
class SceneClass(QGraphicsScene):
grid = 30
def __init__(self, parent=None):
QGraphicsScene.__init__(self, QRectF(-1000, -1000, 2000, 2000), parent)
self._rect = QRectF()
self._flag = False
def drawBackground(self, painter, rect):
if self._flag: self._rect = rect
painter.fillRect(rect, QColor(50, 50, 50))
left = int(rect.left()) - int((rect.left()) % self.grid)
top = int(rect.top()) - int((rect.top()) % self.grid)
right = int(rect.right())
bottom = int(rect.bottom())
lines = []
for x in range(left, right, self.grid):
lines.append(QLineF(x, top, x, bottom)) # QLine QLineF
for y in range(top, bottom, self.grid):
lines.append(QLineF(left, y, right, y)) # QLine QLineF
painter.setPen(QPen(QColor(150, 50, 50)))
painter.drawLines(lines)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self._flag = True
QGraphicsScene.mousePressEvent(self, event)
def mouseReleaseEvent(self, event):
items = self.items(event.scenePos())
self._flag = False
if not items:
item = QGraphicsRectItem(self._rect)
item.setZValue(1)
item.setBrush(QColor(0, 230, 230, 100))
item.setFlags( QGraphicsItem.ItemIsMovable
| QGraphicsItem.ItemIsSelectable
| QGraphicsItem.ItemSendsGeometryChanges
)
self.addItem(item)
self._rect = QRectF()
super().mouseReleaseEvent(event)
class ViewClass(QGraphicsView):
def __init__(self, parent=None):
super(ViewClass, self).__init__(parent)
self.setDragMode(QGraphicsView.RubberBandDrag)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scene = SceneClass()
self.setScene(self.scene)
self.setRenderHint(QPainter.Antialiasing)
class WindowClass(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.view = ViewClass()
self.setCentralWidget(self.view)
if __name__ == '__main__':
app = QApplication(sys.argv)
wd = WindowClass()
wd.show()
sys.exit(app.exec_())



