【问题标题】:Is it possible to paint a QGraphicsItem inside the paint() method?是否可以在 paint() 方法中绘制 QGraphicsItem ?
【发布时间】:2017-08-28 23:53:51
【问题描述】:

我正在创建一个 QGraphicsItem 的子类,并且这个子类有不同的地方可供用户点击。 我的想法是为每个单击的组件创建一个 QGraphicsItem 的子类,并替换 mousePressEvent。问题是如何将这个组件合并到 QGraphicItem 的子类中。

这是我正在尝试的代码,但我不知道如何在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 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)   
        

【问题讨论】:

  • 你能解释清楚吗?
  • 你不需要在父 QGraphicsItem 的绘制方法中做任何事情来显示孩子。这是在他们自己的绘画方法中处理的。在父项的 __init__ 方法中添加子项,而不是在绘制方法中。否则每次调用paint()时都会再次添加新的子元素。
  • 感谢@SimonHibbs,解决方案是在 init 方法上调用 textComponent.setParentItem(self) 和 ellipseComponent.setParentItem(self)。

标签: python qt pyqt qt4 pyside


【解决方案1】:

感谢@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)

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2010-10-04
    • 1970-01-01
    • 2011-11-02
    • 2017-06-27
    • 2013-11-29
    • 2017-12-06
    • 2021-04-14
    相关资源
    最近更新 更多