我正在使用 PyQt4,我想根据用户对显示为图像标签的现有图像的点击画一条线。图像正确显示,单击工具栏中的图标后,用户将在图像上画一条线。
我已经覆盖了 mousePressEvent()
和 mouseReleaseEvent()
以获得 x、y 位置。我定义了 paintEvent()
来画线。
def mousePressEvent(self,event):
self.startx=event.x()
self.starty=event.y()
def mouseReleaseEvent(self,event):
self.endx=event.x()
self.endy=event.y()
def paintEvent(self,event):
painter=QPainter()
painter.begin(self)
painter.setPen(QPen(Qt.darkGray,3))
painter.drawLine(self.startx,self.starty,self.endx,self.endy)
painter.end()
问题:
- 由于我对鼠标事件使用了
self
,因此错误显示: object has no attribute 'self.startx' —(我应该如何将小部件关联到 PyQt 中的鼠标事件?) paintEvent()
即使我在应用程序中移动鼠标也会被调用。
提前致谢...
最佳答案
我建议将线条作为一个单独的对象,在您释放鼠标后创建该对象。为此创建一个新类:
class line(QtGui.QWidget):
def __init__(self, point1, point2):
self.p1 = point1
self.p2 = point2
def paintEvent(self,event):
painter=QPainter()
painter.begin(self)
painter.setPen(QPen(Qt.darkGray,3))
painter.drawLine(self.p1,self.p2)
painter.end()
然后我会像下面这样定义你的鼠标事件。
def mousePressEvent(self,event):
self.startx=event.x()
self.starty=event.y()
def mouseReleaseEvent(self,event):
self.endx=event.x()
self.endy=event.y()
newLine = line(QtCore.QPoint(self.startx, self.starty), QtCore.QPoint(self.endx, self.endy))
这应该允许用户单击并拖动鼠标,然后在释放鼠标时它应该绘制线而不影响其他绘制的内容。我通常在 QGraphicsScenes 中做事,它有点不同,但这个概念应该大致相同。如果你想在用户拖动鼠标时绘制线条,我也知道该怎么做,但我知道的方法比这复杂得多,我建议使用 QGraphicsScene 来处理它,如果你给我发消息想让我解释一下我是怎么做到的。
关于qt4 - PyQt 中的 paintEvent() 被不必要地调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4935284/