使用pyqt扩展QGraphicsItem

1 投票
2 回答
5839 浏览
提问于 2025-04-16 00:31

我该如何创建一个类,让它继承QGraphicsItem,从而定义一种新的项目类型呢?

我正在尝试这样做

#!/usr/bin/python

import sys
from PyQt4 import QtGui

class Node(QtGui.QGraphicsItem):
    def __init__(self, parent = 0):
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)


app = QtGui.QApplication(sys.argv)

scene = QtGui.QGraphicsScene()
scene.addText("test")

scene.addItem(Node())

view = QtGui.QGraphicsView(scene)
view.show()

sys.exit(app.exec_())

但是我遇到了这个错误

Traceback (most recent call last):
  File "primo.py", line 15, in <module>
    scene.addItem(Node())
  File "primo.py", line 8, in __init__
    self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
RuntimeError: underlying C/C++ object has been deleted    

我哪里做错了?我不能在Node的init方法里调用QGraphicsItem的构造函数,因为QGraphicsItem是一个抽象类。

2 个回答

0

如果你想在场景中显示图形,朋友们总是需要实现两个功能:boundingRect() 和 paint(..)。Qt 文档上说:

要编写自己的图形项目,首先需要创建一个 QGraphicsItem 的子类,然后开始实现它的两个纯虚公共函数:boundingRect(),这个函数返回一个估计值,表示这个项目绘制的区域;还有 paint(),这个函数负责实际的绘制工作。例如:

 class SimpleItem : public QGraphicsItem
 {
 public:
     QRectF boundingRect() const
     {
         qreal penWidth = 1;
         return QRectF(-10 - penWidth / 2, -10 - penWidth / 2,
                       20 + penWidth, 20 + penWidth);
     }

     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget)
     {
         painter->drawRoundedRect(-10, -10, 20, 20, 5, 5);
     }
 };
6

解决方案就是这个

#!/usr/bin/python

import sys
from PyQt4 import QtGui

class Node(QtGui.QGraphicsItem):
    def __init__(self, parent = None):
        QtGui.QGraphicsItem.__init__(self,parent)
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)

app = QtGui.QApplication(sys.argv)

scene = QtGui.QGraphicsScene()
scene.addText("test")

scene.addItem(Node())

view = QtGui.QGraphicsView(scene)
view.show()

sys.exit(app.exec_())

撰写回答