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

标签 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,因此错误显示: 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/

相关文章:

qt - 在 Mac OS X Lion 上安装 Qt SDK 的问题

qt4 - Qt Creator 中的 *.qss 文件没有语法高亮显示?

python - 将 QLineEdit 设置为只读但仍接受 Drops

python - 将图像添加到选项卡

python - 重定向 python 交互式帮助()

c++ - 如何在 QT 中获得调整大小 handle ?

c++ - qt 应用程序未运行

c++ - 阻塞等待异步 Qt 信号

python - 角上的小部件 QTabBar 不在角上

Python PyQt QWebView 在单击的选项卡中加载站点