我正在使用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
用于mouseevents,错误说:
对象没有属性'self.startx' - (我应该如何将小部件与PyQt中的mouseevents相关联?)paintEvent()
也会被调用。提前致谢...
答案 0 :(得分:5)
我建议您在释放鼠标后将该行设置为一个单独的对象。为此,请创建一个新类:
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来处理它,只要给我留言,如果你希望我解释一下我是如何做到的。