Python 是否可以在paint()方法内绘制QGraphicsItem?
我正在创建QGraphicsItem的一个子类,这个子类有不同的地方供用户点击。 我的想法是,单击每个组件,创建一个替换了MousePresseEvent的QGraphicsItem子类。问题是如何将此组件合并到QGraphicItem的子类中 下面是我正在尝试的代码,但我不知道如何显示paint方法中的所有组件Python 是否可以在paint()方法内绘制QGraphicsItem?,python,qt,pyqt,qt4,pyside,Python,Qt,Pyqt,Qt4,Pyside,我正在创建QGraphicsItem的一个子类,这个子类有不同的地方供用户点击。 我的想法是,单击每个组件,创建一个替换了MousePresseEvent的QGraphicsItem子类。问题是如何将此组件合并到QGraphicItem的子类中 下面是我正在尝试的代码,但我不知道如何显示paint方法中的所有组件 # -*- coding: utf-8 -*- from PySide import QtGui, QtCore class GraphicItemMain(QtGui.QGraph
# -*- 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 do 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)
感谢@SimonHibbs,解决方案是在init方法上调用textComponent.setParentItem(self)和ellipseComponent.setParentItem(self) 解决方案:
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)
感谢@SimonHibbs,解决方案是在init方法上调用textComponent.setParentItem(self)和ellipseComponent.setParentItem(self) 解决方案:
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)
您能更好地解释一下吗?您不需要在父QGraphicsItem paint方法中执行任何操作来显示子对象。这是在他们自己的绘制方法中处理的。将子项添加到父项的_init__方法中,而不是在paint方法中。否则每次调用paint()时都会再次添加新的子项。感谢@SimonHibbs,解决方案是在init方法上调用textComponent.setParentItem(self)和ellipseComponent.setParentItem(self)。您能更好地解释一下吗?您不需要在父QGraphicsItem paint方法中执行任何操作来显示子项。这是在他们自己的绘制方法中处理的。将子项添加到父项的_init__方法中,而不是在paint方法中。否则每次调用paint()时都会再次添加新的子项。感谢@SimonHibbs,解决方案是在init方法上调用textComponent.setParentItem(self)和ellipseComponent.setParentItem(self)。