2010-06-28 85 views
1

如何创建一个扩展QGraphicsItem的类来定义一种新的Item?用pyqt扩展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  

我在做什么错?我不能叫节点的初始化方法中的QGraphicsItem构造,因为的QGraphicsItem它是一个抽象类

回答

4

的解决方案是这一

#!/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_()) 
1

朋友们总是必须实现的功能boundingRect()和paint(。 )如果你想在场景中显示图形。 Qt文档说:

要编写自己的图形项目,首先创建一个QGraphicsItem的子类,然后开始执行它的两个纯虚拟公共函数:boundingRect(),它返回由item和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); 
    } 
};