首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用鼠标在pyqt中拖动来调整QGraphicsView上的QRubberBand的大小?

如何使用鼠标在pyqt中拖动来调整QGraphicsView上的QRubberBand的大小?
EN

Stack Overflow用户
提问于 2018-06-11 01:18:12
回答 1查看 0关注 0票数 0
代码语言:javascript
复制
class MyView(QtGui.QGraphicsView):
rectChanged = pyqtSignal(QtCore.QRect)

def __init__(self):

    QtGui.QGraphicsView.__init__(self)
    self.scene = QtGui.QGraphicsScene(self)
    self.resize(1326, 400) 
    self.setScene(self.scene)
    self._pixmapHandle = None
    self.x1=0
    self.y1=0
    self.x2=0
    self.y2=0
    self.rubberBand = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle, self)
    self.setMouseTracking(True)
    self.origin = QtCore.QPoint()
    self.changeRubberBand = False


    # Image aspect ratio mode.
    # !!! ONLY applies to full image. Aspect ratio is always ignored when zooming.
    #   Qt.IgnoreAspectRatio: Scale image to fit viewport.
    #   Qt.KeepAspectRatio: Scale image to fit inside viewport, preserving aspect ratio.
    #   Qt.KeepAspectRatioByExpanding: Scale image to fill the viewport, preserving aspect ratio.
    self.aspectRatioMode = Qt.KeepAspectRatio

    # Scroll bar behaviour.
    #   Qt.ScrollBarAlwaysOff: Never shows a scroll bar.
    #   Qt.ScrollBarAlwaysOn: Always shows a scroll bar.
    #   Qt.ScrollBarAsNeeded: Shows a scroll bar only when zoomed.
    self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
    self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

    # Stack of QRectF zoom boxes in scene coordinates.
    self.zoomStack = []

    # Flags for enabling/disabling mouse interaction.
    self.canZoom = True
    self.canPan = True

def save(Self, filename, imgarray):
    im=Image.fromarray(imgarray, 'RGB')
    im.save(filename)

def resizeEvent(self, event):
    """ Maintain current zoom on resize.
    """
    self.rubberBand.resize(self.size())

def mousePressEvent(self, event):
    """ Start mouse pan or zoom mode.
    """
    self.x1=event.x()
    self.y1=event.y()
    if event.button() == Qt.LeftButton:
        if self.canPan:
            self.setDragMode(QtGui.QGraphicsView.ScrollHandDrag)
    elif event.button() == Qt.RightButton:
        self.origin = event.pos()
        self.rubberBand.setGeometry(QtCore.QRect(self.origin, QtCore.QSize()))
        self.rectChanged.emit(self.rubberBand.geometry())
        self.rubberBand.show()
        self.changeRubberBand = True
    QtGui.QGraphicsView.mousePressEvent(self, event)

def mouseMoveEvent(self, event):
    if self.changeRubberBand:
        self.rubberBand.setGeometry(QtCore.QRect(self.origin, event.pos()).normalized())
        self.rectChanged.emit(self.rubberBand.geometry())
    QtGui.QGraphicsView.mouseMoveEvent(self, event)

def mouseReleaseEvent(self, event):
    """ Stop mouse pan or zoom mode (apply zoom if valid).
    """    
    self.x2=event.x()
    self.y2=event.y()   
    QtGui.QGraphicsView.mouseReleaseEvent(self, event)
    scenePos = self.mapToScene(event.pos())
    if event.button() == Qt.LeftButton:
        self.setDragMode(QtGui.QGraphicsView.NoDrag)
    elif event.button() == Qt.RightButton:
        self.changeRubberBand = False
        self.setDragMode(QtGui.QGraphicsView.NoDrag)

我想在图像上显示QRubberBand以启用用户选择。但我也希望QRubberBand通过鼠标移动来调整大小。任何人都可以告诉我,我应该在代码中添加什么。目前我能够使QRubberBand在鼠标释放后仍然保留,但无法使用鼠标点击来调整它的大小。

EN

回答 1

Stack Overflow用户

发布于 2018-06-11 10:35:10

尝试一下:

代码语言:javascript
复制
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class ResizableRubberBand(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ResizableRubberBand, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.SubWindow)
        layout = QtWidgets.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(
            QtWidgets.QSizeGrip(self), 0,
            QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
        layout.addWidget(
            QtWidgets.QSizeGrip(self), 0,
            QtCore.Qt.AlignRight | QtCore.Qt.AlignBottom)
        self._band = QtWidgets.QRubberBand(
            QtWidgets.QRubberBand.Rectangle, self)
        self._band.show()
        self.show()

    def resizeEvent(self, event):
        size = QtCore.QSize(3, 4)
        size.scale(self.size(), QtCore.Qt.KeepAspectRatio)
        self.resize(size)
        self._band.resize(self.size())

class MyView(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(MyView, self).__init__(parent)

        self.button = QtWidgets.QPushButton('Show Rubber Band')
        self.button.clicked.connect(self.handleButton)
        self.label = QtWidgets.QLabel()
        self.label.setScaledContents(True)
        self.label.setPixmap(QtGui.QPixmap('icono.png'))
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.button)

    def handleButton(self):
        self.band = ResizableRubberBand(self.label)
        self.band.setGeometry(50, 50, 150, 300)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MyView()
    window.show()
    window.setGeometry(100, 100, 500, 300)
    sys.exit(app.exec_())           

在这里输入图像描述
在这里输入图像描述
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档