Расширьте QGraphicsItem с помощью pyqt - PullRequest
1 голос
/ 28 июня 2010

Как я могу создать класс, расширяющий QGraphicsItem для определения нового вида Item?

Я пытаюсь это сделать

#!/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 внутри init метода Node, потому что QGraphicsItem это абстрактный класс

Ответы [ 2 ]

5 голосов
/ 28 июня 2010

Решение это

#!/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 голос
/ 14 октября 2011

Друзьям всегда нужно реализовывать функции 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);
     }
 };
...