gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:14:34 26 4
gpt4 key购买 nike

我正在使用 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,因此错误显示:object has no attribute 'self.startx' —(我应该如何将小部件关联到 PyQt 中的鼠标事件?)
  2. 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com