2010-06-28 60 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); 
    } 
};