Как увеличить частоту обновления события mouseMoveEvent в PyQt5?
Здесь при нажатии и движении мышки рисуются очень маленькие линии в QGraphicsScene, которые соединяются друг с другом:
class GraphicsScene(QGraphicsScene):
def __init__(self, parent=None):
QGraphicsScene.__init__(self, parent)
self.setSceneRect(0, 0, 100, 100)
self.pen = QPen(Qt.black)
self.brush = QBrush(Qt.black)
self.lastScenePos = 0
self.currentScenePos = 0
def mousePressEvent(self, event):
x = event.scenePos().x()
y = event.scenePos().y()
self.lastScenePos = (x, y)
self.currentScenePos = (x, y)
self.addEllipse(*self.lastScenePos, 1, 1, self.pen)
print(x, y)
def mouseMoveEvent(self, event):
x = event.scenePos().x()
y = event.scenePos().y()
self.currentScenePos = (x, y)
print(self.lastScenePos, 'last')
print(self.currentScenePos, 'cur')
print('---')
self.addLine(QLineF(*self.lastScenePos, *self.currentScenePos), self.pen)
self.lastScenePos = (x, y)
Но в моей программе я добавил возможность зумировать QGraphicsView. \При приближении видно такую неприятную картину:
И я бы хотел рисовать с помощью множества точек, чтобы это лучше выглядело, но если я быстро двигаю мышку, то линия разрывается на отдельные точки.
Как я понимаю, надо увеличить частоту mouseMoveEvent, чтобы линия не разрывалась. Как это сделать?
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я вставил ваш класс в код и очень быстро двигаю мышку.
И чем быстрее двигаю, тем красивее получается и ничего не разрывается.
import sys
from PyQt5.Qt import *
class GraphicsScene(QGraphicsScene):
def __init__(self, parent=None):
QGraphicsScene.__init__(self, parent)
self.setSceneRect(0, 0, 100, 100)
self.pen = QPen(Qt.red, 3)
self.brush = QBrush(Qt.black)
self.lastScenePos = 0
self.currentScenePos = 0
def mousePressEvent(self, event):
x = event.scenePos().x()
y = event.scenePos().y()
self.lastScenePos = (x, y)
self.currentScenePos = (x, y)
self.addEllipse(*self.lastScenePos, 1, 1, self.pen)
def mouseMoveEvent(self, event):
x = event.scenePos().x()
y = event.scenePos().y()
self.currentScenePos = (x, y)
self.addLine(QLineF(*self.lastScenePos, *self.currentScenePos), self.pen)
self.lastScenePos = (x, y)
class GraphicsView(QGraphicsView):
def __init__(self, parent=None):
super().__init__(parent)
scene = GraphicsScene(self)
self.setScene(scene)
self._pixmap_item = self.scene().addPixmap(QPixmap())
self._pixmap_item.setZValue(-1)
self.__zoom = 0
@property
def pixmap(self):
return self._pixmap_item.pixmap()
@pixmap.setter
def pixmap(self, pixmap):
self._pixmap_item.setPixmap(pixmap)
self.scene().setSceneRect(self._pixmap_item.boundingRect())
def wheelEvent(self, event):
if event.angleDelta().y() > 0:
factor = 1.25
self.__zoom += 1
else:
factor = 0.8
self.__zoom -= 1
self.scale(factor, factor)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.view = GraphicsView(self)
self.view.pixmap = QPixmap("im.png")
addLine = QPushButton("AddLine")
addLine.clicked.connect(self.addLine)
hbox = QHBoxLayout(self)
hbox.addWidget(self.view)
hbox.addWidget(addLine)
def addLine(self):
self.pen = QPen(QColor("#FF00E4"), 7)
self.view.scene().addLine(0, 0, 600, 600, self.pen)
self.view.scene().addLine(600, 600, 20, 200, self.pen)
self.view.scene().addLine(20, 200, 400, 40, self.pen)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())



