Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用QPaint在PyQt标签中释放鼠标后删除矩形_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python 使用QPaint在PyQt标签中释放鼠标后删除矩形

Python 使用QPaint在PyQt标签中释放鼠标后删除矩形,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我试图在PyQt中实现一个矩形颜色选择器工具。我被困在显示图像顶部矩形的第一步,或者更准确地说,在拖动鼠标后释放鼠标后,不再显示矩形 我第一次尝试自己实现它时,我无法删除任何以前绘制的矩形,只留下一个覆盖着矩形的图像 然后我发现这段代码实现了我想要的东西: 要显示相关部分: def mousePressEvent(self,event): self.flag = True self.x0 = event.x() self.y0 = event.y() def

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

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

然后我发现这段代码实现了我想要的东西:

要显示相关部分:

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)
这与标签的图像pixmap相结合,实现了我想要的大部分功能。 然而,不幸的是,我对代码的理解还不够透彻,无法准确地获得先前从
paintEvent
方法中绘制的矩形被删除的位置,这也是我在
mouseReleaseEvent
中想要实现的。这段代码一直显示绘制的矩形,我希望它在释放鼠标后消失

我认为删除先前绘制的矩形可能发生在
update
过程中,但仅仅将
self.update()
添加到
mousereleasevent
中并不能起作用


那么,绘制的矩形究竟在哪里被删除?我如何将其放入发布事件中?

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

def mouseReleaseEvent(self,event):
self.flag=False
self.update()
def paintEvent(自身,事件):
super().paintEvent(事件)
如果不是self.flag:
返回
rect=QRect(
self.x0,self.y0,abs(self.x1-self.x0),abs(self.y1-self.y0))
油漆工=油漆工(自身)
画师设置笔(QPen(Qt.red,2,Qt.SolidLine))
画师:drawRect(rect)

Ok,我刚刚找到了一个解决方法,我将所有x0、x1、y0、y1设置为0,然后在鼠标释放事件中调用update,但这感觉有点脏。。。