【问题标题】:how to use QGraphicsView::RubberBandDrag?如何使用 QGraphicsView::RubberBandDrag?
【发布时间】:2020-05-26 02:38:52
【问题描述】:

有人可以提供一个解释,或者更好的是一个简短的例子,说明如何在QGraphicsView 中使用RubberBandDrag 枚举值? PyQt5 会很棒,但我可以从 C++ 版本进行翻译,如果有人愿意提供有用的示例的话。

NoDragScrollHandDrag 比较容易理解(NoDrag 使鼠标成为指针,您可以捕获某些位置的点击,ScrollHandDrag 使鼠标成为手,您可以实现单击和拖动滚动周围),但我不清楚RubberBandDrag 可以用来做什么。

在有人说“去阅读文档”之前,这里是提供的信息

https://doc.qt.io/qt-5/qgraphicsview.html

枚举 QGraphicsView::DragMode

QGraphicsView::RubberBandDrag

会出现一个橡皮筋。拖动鼠标将设置橡皮筋 几何体,所有被橡皮筋覆盖的项目都被选中。这 非交互式视图的模式被禁用。

这很清楚,但我不确定如何实际使用RubberBandDrag。有没有办法在初始放置后使用它来拖动QPolygon 的点?那真的很有用。

【问题讨论】:

    标签: python pyqt pyqt5 qgraphicsview


    【解决方案1】:

    QGraphicsView::RubberBandDrag 标志仅用于激活内部QRubberBand

    QRubberBand 通常只用于可视化选定区域,在 QGraphicsView 的情况下,如果它们是可选择的,则选择该区域下方的项目(启用 QGraphicsItem::ItemIsSelectable 标志)。


    根据您的最后一个问题:有没有办法在初始放置后使用它来拖动 QPolygon 的点?这真的很有用,在我看来你有一个XY problem,因为在术语中使用 drag 似乎让你认为它用于拖动元素,因为不,那个拖拽是指制作橡皮筋的方式。

    稍后我将展示如何实现顶点的拖动来修改QPolygon

    下面展示了如何通过鼠标拖动来修改顶点的位置:

    import math
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class GripItem(QtWidgets.QGraphicsPathItem):
        circle = QtGui.QPainterPath()
        circle.addEllipse(QtCore.QRectF(-10, -10, 20, 20))
        square = QtGui.QPainterPath()
        square.addRect(QtCore.QRectF(-15, -15, 30, 30))
    
        def __init__(self, annotation_item, index):
            super(GripItem, self).__init__()
            self.m_annotation_item = annotation_item
            self.m_index = index
    
            self.setPath(GripItem.circle)
            self.setBrush(QtGui.QColor("green"))
            self.setPen(QtGui.QPen(QtGui.QColor("green"), 2))
            self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
            self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
            self.setFlag(QtWidgets.QGraphicsItem.ItemSendsGeometryChanges, True)
            self.setAcceptHoverEvents(True)
            self.setZValue(11)
            self.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
    
        def hoverEnterEvent(self, event):
            self.setPath(GripItem.square)
            self.setBrush(QtGui.QColor("red"))
            super(GripItem, self).hoverEnterEvent(event)
    
        def hoverLeaveEvent(self, event):
            self.setPath(GripItem.circle)
            self.setBrush(QtGui.QColor("green"))
            super(GripItem, self).hoverLeaveEvent(event)
    
        def mouseReleaseEvent(self, event):
            self.setSelected(False)
            super(GripItem, self).mouseReleaseEvent(event)
    
        def itemChange(self, change, value):
            if change == QtWidgets.QGraphicsItem.ItemPositionChange and self.isEnabled():
                self.m_annotation_item.movePoint(self.m_index, value)
            return super(GripItem, self).itemChange(change, value)
    
    
    class PolygonAnnotation(QtWidgets.QGraphicsPolygonItem):
        def __init__(self, parent=None):
            super(PolygonAnnotation, self).__init__(parent)
            self.m_points = []
            self.setZValue(10)
            self.setPen(QtGui.QPen(QtGui.QColor("green"), 2))
            self.setAcceptHoverEvents(True)
    
            self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
            self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
            self.setFlag(QtWidgets.QGraphicsItem.ItemSendsGeometryChanges, True)
    
            self.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
    
            self.m_items = []
    
        def addPoint(self, p):
            self.m_points.append(p)
            self.setPolygon(QtGui.QPolygonF(self.m_points))
            item = GripItem(self, len(self.m_points) - 1)
            self.scene().addItem(item)
            self.m_items.append(item)
            item.setPos(p)
    
        def movePoint(self, i, p):
            if 0 <= i < len(self.m_points):
                self.m_points[i] = self.mapFromScene(p)
                self.setPolygon(QtGui.QPolygonF(self.m_points))
    
        def move_item(self, index, pos):
            if 0 <= index < len(self.m_items):
                item = self.m_items[index]
                item.setEnabled(False)
                item.setPos(pos)
                item.setEnabled(True)
    
        def itemChange(self, change, value):
            if change == QtWidgets.QGraphicsItem.ItemPositionHasChanged:
                for i, point in enumerate(self.m_points):
                    self.move_item(i, self.mapToScene(point))
            return super(PolygonAnnotation, self).itemChange(change, value)
    
        def hoverEnterEvent(self, event):
            self.setBrush(QtGui.QColor(255, 0, 0, 100))
            super(PolygonAnnotation, self).hoverEnterEvent(event)
    
        def hoverLeaveEvent(self, event):
            self.setBrush(QtGui.QBrush(QtCore.Qt.NoBrush))
            super(PolygonAnnotation, self).hoverLeaveEvent(event)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        scene = QtWidgets.QGraphicsScene()
        w = QtWidgets.QGraphicsView(scene)
    
        polygon_item = PolygonAnnotation()
        scene.addItem(polygon_item)
        r = 100
        sides = 10
    
        for i in range(sides):
            angle = 2 * math.pi * i / sides
            x = r * math.cos(angle)
            y = r * math.sin(angle)
            p = QtCore.QPointF(x, y) + QtCore.QPointF(200, 200)
            polygon_item.addPoint(p)
    
        w.resize(640, 480)
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多