代码之家  ›  专栏  ›  技术社区  ›  JokerMartini

删除QGraphicsItem周围的虚线选择

  •  1
  • JokerMartini  · 技术社区  · 6 年前

    我在网上搜索了一个解决方案,其中大部分是C++,而不是完整的答案。我想知道是否有人可以帮助我找出如何删除qgraphicsitem周围的选择矩形,如下图所示?

    enter image description here

    import sys
    from PySide.QtGui import *
    from PySide.QtCore import *
    import random
    
    
    class MyGraphicsView(QGraphicsView):
        def __init__(self):
            super(MyGraphicsView, self).__init__()
            self.setDragMode(QGraphicsView.RubberBandDrag)
            self._isPanning = False
            self._mousePressed = False
            # self.setBackgroundBrush(QImage("C:/Users/jmartini/Desktop/Temp/images/flag_0140.jpg"))
            self.setCacheMode(QGraphicsView.CacheBackground)
            self.setHorizontalScrollBarPolicy( Qt.ScrollBarAlwaysOff )
            self.setVerticalScrollBarPolicy( Qt.ScrollBarAlwaysOff )
    
    
        def mousePressEvent(self,  event):
            if event.button() == Qt.LeftButton:
                self._mousePressed = True
                if self._isPanning:
                    self.setCursor(Qt.ClosedHandCursor)
                    self._dragPos = event.pos()
                    event.accept()
                else:
                    super(MyGraphicsView, self).mousePressEvent(event)
            elif event.button() == Qt.MiddleButton:
                self._mousePressed = True
                self._isPanning = True
                self.setCursor(Qt.ClosedHandCursor)
                self._dragPos = event.pos()
                event.accept()
    
    
        def mouseMoveEvent(self, event):
            if self._mousePressed and self._isPanning:
                newPos = event.pos()
                diff = newPos - self._dragPos
                self._dragPos = newPos
                self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - diff.x())
                self.verticalScrollBar().setValue(self.verticalScrollBar().value() - diff.y())
                event.accept()
            else:
                super(MyGraphicsView, self).mouseMoveEvent(event)
    
    
        def mouseReleaseEvent(self, event):
            if event.button() == Qt.LeftButton:
                if self._isPanning:
                    self.setCursor(Qt.OpenHandCursor)
                else:
                    self._isPanning = False
                    self.setCursor(Qt.ArrowCursor)
                self._mousePressed = False
            elif event.button() == Qt.MiddleButton:
                self._isPanning = False
                self.setCursor(Qt.ArrowCursor)
                self._mousePressed = False
            super(MyGraphicsView, self).mouseReleaseEvent(event)
    
    
        def mouseDoubleClickEvent(self, event): 
            self.fitInView(self.sceneRect(), Qt.KeepAspectRatio)
            pass
    
    
        def keyPressEvent(self, event):
            if event.key() == Qt.Key_Space and not self._mousePressed:
                self._isPanning = True
                self.setCursor(Qt.OpenHandCursor)
            else:
                super(MyGraphicsView, self).keyPressEvent(event)
    
    
        def keyReleaseEvent(self, event):
            if event.key() == Qt.Key_Space:
                if not self._mousePressed:
                    self._isPanning = False
                    self.setCursor(Qt.ArrowCursor)
            else:
                super(MyGraphicsView, self).keyPressEvent(event)
    
    
        def wheelEvent(self,  event):
            # zoom factor
            factor = 1.25
    
            # Set Anchors
            self.setTransformationAnchor(QGraphicsView.NoAnchor)
            self.setResizeAnchor(QGraphicsView.NoAnchor)
    
            # Save the scene pos
            oldPos = self.mapToScene(event.pos())
    
            # Zoom
            if event.delta() < 0:
                factor = 1.0 / factor
            self.scale(factor, factor)
    
            # Get the new position
            newPos = self.mapToScene(event.pos())
    
            # Move scene to old position
            delta = newPos - oldPos
            self.translate(delta.x(), delta.y())
    
    
    class MyGraphicsScene(QGraphicsScene):
        def __init__(self,  parent):
            super(MyGraphicsScene,  self).__init__()
            self.setBackgroundBrush(QBrush(QColor(50,50,50)))
            # self.setSceneRect(50,50,0,0)
    
    
    class MyMainWindow(QMainWindow):
        def __init__(self):
            super(MyMainWindow, self).__init__()
            self.setWindowTitle("Test")
            self.resize(800,600)
    
            self.gv = MyGraphicsView()
            self.gv.setScene(MyGraphicsScene(self))
            self.setCentralWidget(self.gv)
    
            self.gv.scene().selectionChanged.connect(self.selection_changed)
            self.populate()
    
    
        def populate(self):
            scene = self.gv.scene()
    
            for i in range(300):
                x = random.randint(-1000, 1000)
                y = random.randint(-1000, 1000)
                r = random.randint(1, 50)
                rect = scene.addEllipse(x, y, r, r, 
                    QPen(QColor(255,128,0), 0.5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin), 
                    QBrush(QColor(255,128,20,128)))
                rect.setFlag( QGraphicsItem.ItemIsSelectable )
                rect.setFlag( QGraphicsItem.ItemIsMovable )
    
            rect = scene.addEllipse(10, 20, 20, 20, 
                QPen(QColor(255,128,0), 0.5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin), 
                QBrush(QColor(255,0,0,128)))
            rect.setFlag( QGraphicsItem.ItemIsSelectable )
            rect.setFlag( QGraphicsItem.ItemIsMovable )
    
            points = QPolygonF()
            points.append(QPointF(10.4, 10.5))
            points.append(QPointF(40.2, 60.2))
            points.append(QPointF(30.2, 90.2))
            points.append(QPointF(10.2, 80.2))
            poly = scene.addPolygon(points, 
                QPen(QColor(255,128,0), 0.5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin), 
                QBrush(QColor(255,0,0,128)))
            poly.setFlag( QGraphicsItem.ItemIsSelectable )
            poly.setFlag( QGraphicsItem.ItemIsMovable )
    
    
        def selection_changed(self):
            selection = self.gv.scene().selectedItems()
            print 'Selected:', len(selection)
            for i in selection:
                i.setPen(QPen(QColor(255,255,255), 0.5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
    
    
    def main():
        app = QApplication(sys.argv)
        ex = MyMainWindow()
        ex.show()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc RAHUL KUMAR    6 年前

    默认项将绘制 boundingRect() 选择后,解决方案是覆盖 paint(...) 方法:

    class EllipseItem(QGraphicsEllipseItem):
        def paint(self, painter, option, widget):
            option.state &= ~QStyle.State_Selected
            super(EllipseItem, self).paint(painter, option, widget)
    
    class PolygonItem(QGraphicsPolygonItem):
        def paint(self, painter, option, widget):
            option.state &= ~QStyle.State_Selected
            super(PolygonItem, self).paint(painter, option, widget)
    

    所以现在你必须在代码中使用它:

    def populate(self):
        scene = self.gv.scene()
    
        for i in range(300):
            x = random.randint(-1000, 1000)
            y = random.randint(-1000, 1000)
            r = random.randint(1, 50)
            rect = EllipseItem(x, y, r, r)
            rect.setPen(QPen(QColor(255,128,0), 0.5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
            rect.setBrush(QBrush(QColor(255,128,20,128)))
            scene.addItem(rect)
            rect.setFlag( QGraphicsItem.ItemIsSelectable )
            rect.setFlag( QGraphicsItem.ItemIsMovable )
    
        rect = EllipseItem(10, 20, 20, 20) 
        rect.setPen(QPen(QColor(255,128,0), 0.5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
        rect.setBrush(QBrush(QColor(255,0,0,128)))
        rect.setFlag( QGraphicsItem.ItemIsSelectable )
        rect.setFlag( QGraphicsItem.ItemIsMovable )
        scene.addItem(rect)
    
        points = QPolygonF()
        points.append(QPointF(10.4, 10.5))
        points.append(QPointF(40.2, 60.2))
        points.append(QPointF(30.2, 90.2))
        points.append(QPointF(10.2, 80.2))
        poly = PolygonItem(points)
        poly.setPen(QPen(QColor(255,128,0), 0.5, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)) 
        poly.setBrush(QBrush(QColor(255,0,0,128)))
        poly.setFlag( QGraphicsItem.ItemIsSelectable )
        poly.setFlag( QGraphicsItem.ItemIsMovable )
        scene.addItem(poly)
    

    enter image description here