PyQt中的paintEvent()被不必要地调用

时间:2011-02-08 15:58:46

标签: qt4 pyqt4

我正在使用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()

问题:

  1. 由于我将self用于mouseevents,错误说: 对象没有属性'self.startx' - (我应该如何将小部件与PyQt中的mouseevents相关联?)
  2. 即使我在应用程序周围移动鼠标,
  3. paintEvent()也会被调用。
  4. 提前致谢...

1 个答案:

答案 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来处理它,只要给我留言,如果你希望我解释一下我是如何做到的。