【问题标题】:paintEvent() in PyQt called unnecessarilyPyQt 中的paintEvent() 被不必要地调用
【发布时间】:2023-03-12 19:34:01
【问题描述】:

我正在使用 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 中的 mouseevents 相关联?)
  2. paintEvent() 即使我在应用中移动鼠标也会被调用。

提前致谢……

【问题讨论】:

    标签: qt4 pyqt4


    【解决方案1】:

    我建议将该行作为一个单独的对象,一旦您释放鼠标就会创建该对象。为此,请创建一个新类:

    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 来处理它,如果你给我发消息想让我解释一下我是怎么做到的。

    【讨论】:

    • 非常感谢布洛克。但是控件转到行对象中的构造函数,但是没有调用paintEvent()(我添加了打印语句)。另外,如果你通过QraphicsScene告诉我如何做到这一点,我会很高兴。(我不能获取您的邮件 ID。)再次感谢。
    • 好吧,让我们看看我能如何解释这一点...... QGraphicsScene 就像一个容器,其中包含许多对象(QGraphicsItems)。 QGraphicsView 是您放置在 GUI 中的内容,用于在屏幕上绘制场景的内容。你可以在 QGraphicsScene 中绘制任何你想要的东西并与之交互,如果你愿意,你甚至可以使用 OpenGL 加速。无论如何,足够的认可,这里有一个链接可以让你开始制作你的 QGraphicsView 和 QGraphicsScene 并将你的场景链接到你的视图:[lateral.netmanagers.com.ar/stories/BBS53.html]
    • 我刚刚链接的那个教程很好地解释了一切,这也是我第一次开始了解 QGraphicsScenes 是如何工作的。唯一的问题是它不是用 PyQt4 编写的,我无法让代码与我使用的 pyqt 版本一起工作,所以我将编写一些代码向您展示在 QGraphicsScene 中绘制线条的过程,本教程应该教育你有点,所以当我准备好代码时,它应该很容易理解并了解它是如何工作的。
    • 真是个不错的教程。我现在正在修改我的代码。非常感谢您的支持...:)
    • 好吧,这是我承诺的示例代码:megaupload.com/?d=696T2A11。里面有很多 cmets,所以你应该能够理解它是如何工作的。我只是快速地将这段代码放在一起,因此存在一些错误,例如当用户在不移动鼠标的情况下单击和释放时,但对于主要部分它工作正常。如果您对此有任何疑问,可以在推特上找到我:BrockS_18,这可能是最可靠的方式(我真的不想公开发布我的电子邮件),或者您可以在这里再次发布并希望我会看到的。无论如何,我希望它有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多