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

Qt4 PyQt中的paintEvent()被不必要地调用,qt4,pyqt4,Qt4,Pyqt4,我使用的是PyQt4,我想根据用户单击显示为imagelabel的现有图像绘制一条线。图像正确显示,单击工具栏中的图标后,用户将在图像上画一条线 我已经覆盖了mousePressEvent()和mouseReleaseEvent()以获得x,y位置。我已经定义了paintEvent()来划定界限 def mousePressEvent(self,event): self.startx=event.x() self.starty=event.y() def mouseReleas

我使用的是PyQt4,我想根据用户单击显示为imagelabel的现有图像绘制一条线。图像正确显示,单击工具栏中的图标后,用户将在图像上画一条线

我已经覆盖了
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()
问题:
  • 由于我对mouseevents使用了
    self
    ,错误显示: 对象没有属性“self.startx”-(我应该如何将小部件与PyQt中的mouseevents关联?)
  • 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))
    

    这应该允许用户单击并拖动鼠标,然后在释放鼠标时,它应该绘制线,而不会影响其他绘制的内容。我通常用QGraphicsCENES做事情,这有点不同,但是这个概念应该是一样的。如果您想在用户拖动鼠标时绘制线条,我也知道该怎么做,但我知道的方式比这复杂得多,我建议使用QGraphicscene来处理,如果您想让我解释一下我是如何做到的,请给我发消息。

    非常感谢Brock。但是控件转到了line对象中的构造函数,但是paintEvent()没有被调用(我添加了打印语句)。另外,如果你能再次告诉我如何通过QraphicsScene(我无法获得你的邮件id)Thanx来实现这一点,我会很高兴。好吧,让我们看看我能如何很好地解释这一点……Qgraphicscene就像一个容纳许多对象的容器(QMS)其中。QGraphicsView是您在GUI中放置的东西,用于在屏幕上绘制场景内容。您可以在QGraphicsCenter中绘制任何您想要的内容并与之交互,如果您愿意,您甚至可以使用OpenGL加速。总之,有了认可,这里有一个链接可以让您开始制作QGraphicsVieww和Qgraphicscene并将场景链接到视图:[我刚刚链接的那个教程很好地解释了所有内容,这也是我第一次开始理解QGraphicscene是如何工作的。唯一的问题是它不是用PyQt4编写的,我无法让代码与我使用的pyqt版本一起工作,所以我将编写一些代码,向您展示在QGraphicscene中绘制线条的过程本教程应该会对您有所教育,所以当我准备好代码时,应该很容易理解并了解它的工作原理。真的是一个很好的教程。我现在正在修改我的代码。非常感谢您的支持…:)好的,这是我承诺的示例代码:。其中有很多注释,因此您应该能够理解它是如何工作的。我只是快速地将这些代码组合在一起,因此存在一些错误,例如当用户单击并释放而不移动鼠标时,但对于主要部分,它工作正常。如果您对此有任何疑问,可以在twitter上找到我:BrockS_18,这可能是最可靠的方式(我真的不想公开发布我的电子邮件),或者你可以在这里再次发布,希望我能看到。无论如何,我希望它能有所帮助。