【问题标题】:use mouse drag to change the width of a rectangle?使用鼠标拖动来改变矩形的宽度?
【发布时间】:2020-12-05 21:42:54
【问题描述】:

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

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_())

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    我在 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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多