【发布时间】:2018-09-22 22:14:13
【问题描述】:
在尝试实现绘画时,我决定从形状开始 我的初始化:
def __init__(self, parent=None):
self.modified = False
self.rectangle = False
self.ellipse = False
self.begin = QPoint()
self.end = QPoint()
self.myPenWidth = 1
self.myFigureColor = Qt.black
self.image = QImage()
我有一个事件,其中有绘制形状的功能
def mousePressEvent(self, event):
if (event.button() == Qt.LeftButton) and self.rectangle:
self.draw_rectandle(event)
if (event.button() == Qt.LeftButton) and self.ellipse:
self.draw_ellipse(event)
这里我们使用位于绘制图形的函数: 我会在下面发布它们
def mouseMoveEvent(self, event):
if (event.buttons() & Qt.LeftButton) and self.rectangle:
self.end = event.pos()
self.update()
if (event.buttons() & Qt.LeftButton) and self.ellipse:
self.end = event.pos()
self.update()
和
def mouseReleaseEvent(self, event):
if (event.buttons() & Qt.LeftButton) and self.rectangle:
self.begin = event.pos()
self.end = event.pos()
if (event.buttons() & Qt.LeftButton) and self.ellipse:
self.begin = event.pos()
self.end = event.pos()
还有另一个函数paintEvent:
def paintEvent(self, event):
painter = QPainter(self)
dirtyRect = event.rect()
painter.drawImage(dirtyRect, self.image, dirtyRect)
if self.rectangle == True:
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawRect(QRect(self.begin, self.end))
if self.ellipse == True:
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawEllipse(QRect(self.begin, self.end))
人物本身的功能:
def draw_rectandle(self, event):
painter = QPainter(self.image)
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawRect(QRect(self.begin, self.end))
self.begin = event.pos()
self.end = event.pos()
self.modified = True
self.update()
def draw_ellipse(self, event):
painter = QPainter(self.image)
painter.setPen(QPen(self.myFigureColor, self.myPenWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
painter.drawEllipse(QRect(self.begin, self.end))
self.begin = event.pos()
self.end = event.pos()
self.modified = True
self.update()
还有“伪绑定”
def rectangleOn(self):
self.ellipse = False
self.rectangle = True
def ellipseOn(self):
self.rectangle = False
self.ellipse = True
它们用于在按下形状按钮时更改功能标志。 如果您需要,按钮本身看起来像:
动作:
self.rectangle = QAction(QIcon('Image/rectangle.png'), 'Rectangle', self)
self.rectangle.triggered.connect(self.scribbleArea.rectangleOn)
self.ellipse = QAction(QIcon('Image/Ellipse.png'), 'Ellipse', self)
self.ellipse.triggered.connect(self.scribbleArea.ellipseOn)
带按钮的工具栏:
toolbar = self.addToolBar('Tools')
toolbar.addAction(self.rectangle)
toolbar.addAction(self.ellipse)
我认为不需要改变颜色和大小的函数。因此,虽然我不会发布。
现在我会告诉你问题出在哪里。
在paintEvent 中,我有一个显示形状的绘图。也就是说,我们拉边缘,看看形状是如何变化的。但是从那里它不会保存在任何地方。
并且在 mousePressEvent 中已经绘制了矩形本身而没有这个拖动动画
看起来一切都很好,但是这里有一个错误
如您所见,矩形的绘制是通过 mousePressEvent 进行的。这意味着只有在我开始绘制下一个矩形时才会出现矩形。这已经是一个错误。但!如果我画了几个矩形并开始画一个椭圆,最后一个矩形就变成了一个椭圆。
还有我的其他形状。
如果我开始画一条线,然后切换到一个椭圆,在另一个地方开始画椭圆,我画的线会立即变成一个很窄的椭圆。
因此,我需要以某种方式从 mousePressEvent 中拉出这个函数,以便绘制所需的形状,并在工具之间进行这种切换。
如果您需要更多详细信息,请写 с:
附:如果有问题,我为我的英语道歉с:
【问题讨论】:
标签: python python-3.x pyqt pyqt5