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