2017-04-03 49 views
0

我正在創建QGraphicsItem的子類,並且此子類具有用戶可以單擊的不同位置。 我的想法是點擊每個組件以創建QGraphicsItem的子類,並替換mousePressEvent。問題是我如何將這個組件合併到QGraphicItem的子類中。是否可以在paint()方法內繪製一個QGraphicsItem?

這是我正在嘗試的代碼,但我不知道如何在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__方法中添加子項,而不是繪製方法。否則,每次調用paint()時都會再次添加新的子項。 –

+0

謝謝@SimonHibbs,解決方案是在__init__方法上調用textComponent.setParentItem(self)和ellipseComponent.setParentItem(self)。 –

回答

1

由於@SimonHibbs,將溶液對初始化方法調用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) 
相關問題