pyqt add rectangle in Qgraphicsscene

后端 未结 1 2139
陌清茗
陌清茗 2020-12-16 08:37

I have a scene like this

class Scene(QtWidgets.QGraphicsScene):
    def __init__(self, parent=None):
        super(Scene, self).__init__(parent)

    def mou         


        
相关标签:
1条回答
  • 2020-12-16 09:31

    First of all a QGraphicsItem is not a QWidget, so it has those events and does not handle them directly, that's what QGraphicsView and QGraphicsScene do. For example you say that you want to have a moveable rectangle because that task is simple is QGraphicsView, it is not necessary to overwrite:

    from PyQt5 import QtCore, QtWidgets
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            scene = QtWidgets.QGraphicsScene(self)
            view = QtWidgets.QGraphicsView(scene)
            self.setCentralWidget(view)
    
            rect_item = QtWidgets.QGraphicsRectItem(QtCore.QRectF(0, 0, 100, 100))
            rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
            scene.addItem(rect_item) 
    
    
    if __name__ == '__main__':
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.resize(640, 480)
        w.show()
        sys.exit(app.exec_())
    

    If you want to change the way you paint the rectangle you must overwrite the paint() method as shown below:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class RectItem(QtWidgets.QGraphicsRectItem):
        def paint(self, painter, option, widget=None):
            super(RectItem, self).paint(painter, option, widget)
            painter.save()
            painter.setRenderHint(QtGui.QPainter.Antialiasing)
            painter.setBrush(QtCore.Qt.red)
            painter.drawEllipse(option.rect)
            painter.restore()
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            scene = QtWidgets.QGraphicsScene(self)
            view = QtWidgets.QGraphicsView(scene)
            self.setCentralWidget(view)
    
            rect_item = RectItem(QtCore.QRectF(0, 0, 100, 100))
            rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
            scene.addItem(rect_item) 
    
    
    if __name__ == '__main__':
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.resize(640, 480)
        w.show()
        sys.exit(app.exec_())
    

    Update:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class GraphicsScene(QtWidgets.QGraphicsScene):
        def __init__(self, parent=None):
            super(GraphicsScene, self).__init__(QtCore.QRectF(-500, -500, 1000, 1000), parent)
            self._start = QtCore.QPointF()
            self._current_rect_item = None
    
        def mousePressEvent(self, event):
            if self.itemAt(event.scenePos(), QtGui.QTransform()) is None:
                self._current_rect_item = QtWidgets.QGraphicsRectItem()
                self._current_rect_item.setBrush(QtCore.Qt.red)
                self._current_rect_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
                self.addItem(self._current_rect_item)
                self._start = event.scenePos()
                r = QtCore.QRectF(self._start, self._start)
                self._current_rect_item.setRect(r)
            super(GraphicsScene, self).mousePressEvent(event)
    
        def mouseMoveEvent(self, event):
            if self._current_rect_item is not None:
                r = QtCore.QRectF(self._start, event.scenePos()).normalized()
                self._current_rect_item.setRect(r)
            super(GraphicsScene, self).mouseMoveEvent(event)
    
        def mouseReleaseEvent(self, event):
            self._current_rect_item = None
            super(GraphicsScene, self).mouseReleaseEvent(event)
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            scene =GraphicsScene(self)
            view = QtWidgets.QGraphicsView(scene)
            self.setCentralWidget(view)
    
    
    if __name__ == '__main__':
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.resize(640, 480)
        w.show()
        sys.exit(app.exec_())
    
    0 讨论(0)
提交回复
热议问题