Python 使用鼠标拖动更改矩形的宽度?

Python 使用鼠标拖动更改矩形的宽度?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我得到了这个代码,可以帮助我从另一个答案中画出一个矩形,我希望能够拖动矩形的左右两侧来调整矩形的宽度,使矩形的行为方式类似于在大多数照片编辑软件上裁剪图像的方式,绘制初始区域,但之后可以调整宽度以获得所需的裁剪。 到目前为止,我掌握的代码是: import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class MyWidget(QWidget): d

我得到了这个代码,可以帮助我从另一个答案中画出一个矩形,我希望能够拖动矩形的左右两侧来调整矩形的宽度,使矩形的行为方式类似于在大多数照片编辑软件上裁剪图像的方式,绘制初始区域,但之后可以调整宽度以获得所需的裁剪。 到目前为止,我掌握的代码是:

import sys


from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(30,30,600,400)
        self.begin = QPoint()
        self.end = QPoint()
        self.show()

    def paintEvent(self, event):
        qp = QPainter(self)
        br = QBrush(QColor(100, 10, 10, 40))  
        qp.setBrush(br)   
        qp.drawRect(QRect(self.begin, self.end))       

    def mousePressEvent(self, event):
        self.begin = event.pos()
        self.end = event.pos()
        # print(f"press begin {self.begin}")
        # print(f"press end   {self.end}")
        self.update()

    def mouseMoveEvent(self, event):
        self.end = event.pos()
        self.update()

    def mouseReleaseEvent(self, event):
        #self.begin = event.pos()
        self.end = event.pos()
        #self.update()
        print(f"begin {self.begin}")
        print(f"end   {self.end}")



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWidget()
    window.show()
    app.aboutToQuit.connect(app.deleteLater)
    sys.exit(app.exec_())


我在PyQt论坛上找到了这个问题的答案,这是一个名叫Salem Bream的人提供的,他回答了我的问题,我想我会与SO社区分享

import sys

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


FREE_STATE = 1
BUILDING_SQUARE = 2
BEGIN_SIDE_EDIT = 3
END_SIDE_EDIT = 4


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(30, 30, 600, 400)
        self.begin = QPoint()
        self.end = QPoint()

        self.state = FREE_STATE

    def paintEvent(self, event):
        qp = QPainter(self)
        br = QBrush(QColor(100, 10, 10, 40))
        qp.setBrush(br)
        qp.drawRect(QRect(self.begin, self.end))

    def mousePressEvent(self, event):
        if not self.begin.isNull() and not self.end.isNull():
            p = event.pos()
            y1, y2 = sorted([self.begin.y(), self.end.y()])
            if y1 <= p.y() <= y2:
                # 3 resolution, more easy to pick than 1px
                if abs(self.begin.x() - p.x()) <= 3:
                    self.state = BEGIN_SIDE_EDIT
                    return
                elif abs(self.end.x() - p.x()) <= 3:
                    self.state = END_SIDE_EDIT
                    return
        self.state = BUILDING_SQUARE

        self.begin = event.pos()
        self.end = event.pos()
        self.update()

    def applye_event(self, event):

        if self.state == BUILDING_SQUARE:
            self.end = event.pos()
        elif self.state == BEGIN_SIDE_EDIT:
            self.begin.setX(event.x())
        elif self.state == END_SIDE_EDIT:
            self.end.setX(event.x())

    def mouseMoveEvent(self, event):
        self.applye_event(event)
        self.update()

    def mouseReleaseEvent(self, event):
        self.applye_event(event)
        self.state = FREE_STATE


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWidget()
    window.show()
    app.aboutToQuit.connect(app.deleteLater)
    sys.exit(app.exec_())
导入系统 从PyQt5.QtCore导入* 从PyQt5.QtGui导入* 从PyQt5.QtWidgets导入* 自由状态=1 建筑面积=2 开始\u侧\u编辑=3 结束侧编辑=4 类MyWidget(QWidget): 定义初始化(自): super()。\uuuu init\uuuuu() self.setGeometry(30、30、600、400) self.begin=QPoint() self.end=QPoint() self.state=自由状态 def paintEvent(自身,事件): qp=QPainter(自行) br=QBrush(QColor(100,10,10,40)) qp.挫折(br) qp.drawRect(QRect(self.begin,self.end)) def鼠标压力事件(自身、事件): 如果不是self.begin.isNull()而不是self.end.isNull(): p=事件。位置() y1,y2=已排序([self.begin.y(),self.end.y()])) 如果y1