【问题标题】:Delete rectangle after mouse release in PyQt label with QPainter使用 QPainter 在 PyQt 标签中释放鼠标后删除矩形
【发布时间】:2021-05-15 02:28:51
【问题描述】:

我正在尝试在 PyQt 中实现一个矩形颜色选择器工具。我被困在在图像顶部显示矩形的第一步,或者更准确地说,在拖动鼠标后松开鼠标后不再显示矩形。

我第一次尝试自己实现它,我无法删除任何以前绘制的矩形,只剩下一个被矩形覆盖的图像。

然后我发现这段代码几乎完全实现了我正在寻找的东西:

https://www.programmersought.com/article/485354263/

显示相关部分:

def mousePressEvent(self,event):
    self.flag = True
    self.x0 = event.x()
    self.y0 = event.y()
    
def mouseReleaseEvent(self,event):
    self.flag = False
    
def mouseMoveEvent(self,event):
    if self.flag:
        self.x1 = event.x()
        self.y1 = event.y()
        self.update()

def paintEvent(self, event):
    super().paintEvent(event)
    rect = QRect(self.x0, self.y0, abs(self.x1-self.x0), abs(self.y1-self.y0))
    painter = QPainter(self)
    painter.setPen(QPen(Qt.red,2,Qt.SolidLine))
    painter.drawRect(rect)

这与标签的图像像素图相结合可以满足我的大部分需求。 但是,不幸的是,我对代码的理解不够好,无法从paintEvent 方法中删除之前绘制的矩形,这也是我想在mouseReleaseEvent 中完成的。此代码一直显示绘制的矩形,我希望它在释放鼠标后消失。

我认为在update 期间可能会删除先前绘制的矩形,但只是将self.update() 添加到mouseReleaseEvent 并不能解决问题。

那么,绘制的矩形到底在哪里被删除了,我该如何把它放在发布事件中?

【问题讨论】:

  • 好的,我刚刚找到了一个解决方法,我将所有 x0,x1,y0,y1 = 0 设置为然后在鼠标释放事件中调用更新,但这感觉有点脏...

标签: python pyqt pyqt5


【解决方案1】:

仅当 self.flag 为 True 时才绘制矩形。发布后使用self.update()请求重绘。

def mouseReleaseEvent(self,event):
    self.flag = False
    self.update()

def paintEvent(self, event):
    super().paintEvent(event)
    if not self.flag:
        return
    rect = QRect(
        self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0))
    painter = QPainter(self)
    painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))
    painter.drawRect(rect)

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多