2017-04-03 10 views
0

私はQGraphicsItemのサブクラスを作成しています。このサブクラスは、ユーザーがクリックできる場所が異なります。 私の考えは、クリックされた各コンポーネントがmousePressEventを置き換えたQGraphicsItemのサブクラスを作成することです。問題は、このコンポーネントをQGraphicItemのサブクラスにどのようにマージできるかです。QGraphicsItemをpaint()メソッド内にペイントすることは可能ですか?

ここで私が試しているコードはありますが、paintメソッドのすべてのコンポーネントを表示する方法はわかりません。

# -*- coding: utf-8 -*- 
from PySide import QtGui, QtCore 

class GraphicItemMain(QtGui.QGraphicsItem): 

    def __init__(self, x, y): 
     super(GraphicItemMain, self).__init__() 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True) 
     self.setAcceptsHoverEvents(True) 
     self.x = x 
     self.y = y 

    def boundingRect(self): 
     return QtCore.QRectF(self.x, self.y, 100, 100) 

    def paint(self, painter, option, widget): 
     textComponent = GraphicItemTextClicked(5+self.x, 5+self.y) 
     ellipseComponent = GraphicItemEllipseClicked(5+self.x, 50+self.y) 
     #How I print this components? 

class GraphicItemTextClicked(QtGui.QGraphicsItem): 

    def __init__(self, x, y): 
     super(GraphicItemTextClicked, self).__init__() 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True) 
     self.setAcceptsHoverEvents(True) 
     self.x = x 
     self.y = y 

    def mousePressEvent(self, event): 
     #Do something 
     QtGui.QGraphicsItem.mousePressEvent(self, event) 

    def boundingRect(self): 
     return QtCore.QRectF(self.x, self.y, 80, 30) 

    def paint(self, painter, option, widget): 
     painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 1)) 
     font = QtGui.QFont() 
     font.setPointSize(12) 
     painter.setFont(font) 
     painter.drawText(QtCore.QPointF(3+self.x, self.y), "Same Text") 

class GraphicItemEllipseClicked(QtGui.QGraphicsItem): 

    def __init__(self, x, y): 
     super(GraphicItemEllipseClicked, self).__init__() 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True) 
     self.setAcceptsHoverEvents(True) 
     self.x = x 
     self.y = y 

    def mousePressEvent(self, event): 
     #Do other thing 
     QtGui.QGraphicsItem.mousePressEvent(self, event) 

    def boundingRect(self): 
     return QtCore.QRectF(self.x, self.y, 25, 25) 

    def paint(self, painter, option, widget): 
     painter.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0), 1)) 
     painter.drawEllipse(self.x, self.y, 25, 25) 
+0

あなたは私をもっとよく説明できますか? – eyllanesc

+0

子を表示するには、親のQGraphicsItemペイントメソッドで何もする必要はありません。これは独自のペイント方法で処理されます。親メソッドの__init__methodに子アイテムを追加します。ペイントメソッドは追加しません。それ以外の場合は、paint()が呼び出されるたびに新しい子が追加されます。 –

+0

@SimonHibbsありがとうございました。解決策は、__init__メソッドでtextComponent.setParentItem(self)とellipseComponent.setParentItem(self)を呼び出すことでした。 –

答えて

1

ありがとう@SimonHibbs、ソリューションは、のinit方法にtextComponent.setParentItem(自己)とellipseComponent.setParentItem(自己)を呼び出すことでした。

ソリューション:

from PySide import QtGui, QtCore 

class GraphicItemMain(QtGui.QGraphicsItem): 

    def __init__(self, x, y): 
     super(GraphicItemMain, self).__init__() 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True) 
     self.setAcceptsHoverEvents(True) 
     self.x = x 
     self.y = y 
     textComponent = GraphicItemTextClicked(5+self.x, 5+self.y) 
     textComponent.setParentItem(self) 
     ellipseComponent = GraphicItemEllipseClicked(5+self.x, 50+self.y) 
     ellipseComponent.setParentItem(self) 

    def boundingRect(self): 
     return QtCore.QRectF(self.x, self.y, 100, 100) 

    def paint(self, painter, option, widget): 
     #Paint samething 

class GraphicItemTextClicked(QtGui.QGraphicsItem): 

    def __init__(self, x, y): 
     super(GraphicItemTextClicked, self).__init__() 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True) 
     self.setAcceptsHoverEvents(True) 
     self.x = x 
     self.y = y 

    def mousePressEvent(self, event): 
     #Do something 
     QtGui.QGraphicsItem.mousePressEvent(self, event) 

    def boundingRect(self): 
     return QtCore.QRectF(self.x, self.y, 80, 30) 

    def paint(self, painter, option, widget): 
     painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 1)) 
     font = QtGui.QFont() 
     font.setPointSize(12) 
     painter.setFont(font) 
     painter.drawText(QtCore.QPointF(3+self.x, self.y), "Same Text") 

class GraphicItemEllipseClicked(QtGui.QGraphicsItem): 

    def __init__(self, x, y): 
     super(GraphicItemEllipseClicked, self).__init__() 
     self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, False) 
     self.setFlag(QtGui.QGraphicsItem.ItemIsFocusable, True) 
     self.setAcceptsHoverEvents(True) 
     self.x = x 
     self.y = y 

    def mousePressEvent(self, event): 
     #Do other thing 
     QtGui.QGraphicsItem.mousePressEvent(self, event) 

    def boundingRect(self): 
     return QtCore.QRectF(self.x, self.y, 25, 25) 

    def paint(self, painter, option, widget): 
     painter.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0), 1)) 
     painter.drawEllipse(self.x, self.y, 25, 25) 
関連する問題