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

vet*_*yan 3 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()
Run Code Online (Sandbox Code Playgroud)

问题:

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

提前致谢…

Bro*_* S. 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()
Run Code Online (Sandbox Code Playgroud)

然后我会定义你的鼠标事件如下.

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))
Run Code Online (Sandbox Code Playgroud)

这应该允许用户单击并拖动鼠标,然后在释放鼠标时应该绘制线条而不影响绘制的任何其他内容.我通常在QGraphicsScenes中做一些事情并且它有点不同,但这个概念应该大致相同.如果你想在用户拖动鼠标时绘制线条,我也知道如何做到这一点,但我知道的方式要比这复杂得多,我建议使用QGraphicsScene来处理它,只要给我留言如果你想让我解释一下我是如何做到的.

  • 好吧,让我们看看我能解释这个问题....一个QGraphicsScene就像一个容器,里面有许多对象(QGraphicsItems).QGraphicsView是您在GUI中绘制的,用于绘制屏幕上场景的内容.您可以在QGraphicsScene中绘制和交互任何内容,甚至可以根据需要使用OpenGL加速.无论如何,足够的代言,这里有一个链接,可以让你开始制作你的QGraphicsView和QGraphicsScene并将你的场景链接到你的观点:[http://lateral.netmanagers.com.ar/stories/BBS53.html ] (2认同)
  • 我刚刚链接的那个教程很好地解释了所有内容,这就是我开始理解QGraphicsScenes如何工作的方式.唯一的问题是它不是用PyQt4编写的,我无法使用我使用的pyqt版本的代码,所以我会编写一些代码来向你展示在QGraphicsScene中绘制一条线的过程,本教程应该教育当你准备好代码时,你应该很容易理解,看看它是如何工作的. (2认同)