【问题标题】:QGraphicsPathItem different colorsQGraphicsPathItem 不同颜色
【发布时间】:2015-11-27 12:32:29
【问题描述】:

有没有办法为单个 QGraphicsPathItem 对象获得 2 种不同的填充颜色?

例如:

    # Try to get a white text onto a grey rectangle
    itemPath = QtGui.QPainterPath()
    itemPath.setFillRule(QtCore.Qt.WindingFill)

    self.setBrush( QtGui.QColor(100, 100, 100) )
    itemPath.addRect(-10, -60, 150, 70)
    itemFont = QtGui.QFont()
    itemFont.setPointSize(50)
    self.setBrush( QtGui.QColor(255, 255, 255) )
    itemPath.addText(0, 0, itemFont, txt)

现在它只是使用矩形和文本的最后一个画笔颜色。虽然我想给它们涂上不同的颜色,但还是一样的QGraphicsPathItem。或者更好的是,一种为文本提供背景以便更容易选择的方法。

更新

这是一个例子。我想要一个带有红色背景的白色文本,但我只得到最后使用的画笔颜色。

from PySide import QtGui, QtCore

class TextItem(QtGui.QGraphicsPathItem):
    def __init__(self):
        super(TextItem, self).__init__()

        itemPath = QtGui.QPainterPath()
        itemPath.setFillRule(QtCore.Qt.WindingFill)

        # Create rectangle with red color
        self.setBrush( QtGui.QColor(255, 0, 0) )
        itemPath.addRect(-10, -50, 130, 60)
        self.setPath(itemPath)

        # Create text with white color
        itemFont = QtGui.QFont()
        itemFont.setPointSize(40)
        self.setBrush( QtGui.QColor(255, 255, 255) )
        itemPath.addText(0, 0, itemFont, 'Test!')
        self.setPath(itemPath)

        self.moveBy(100, 100)

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.resize(500, 500)
        self.view = QtGui.QGraphicsView(self)
        self.view.setScene( QtGui.QGraphicsScene(self) )
        self.view.setSceneRect( 0, 0, 500, 500 )
        self.view.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)        

        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.view)
        self.setLayout(mainLayout)

        newItem = TextItem()
        self.view.scene().addItem( newItem )

    def run(self):
        self.show()

win = Window()
win.show()

【问题讨论】:

  • 提供一个最小的运行示例会很有帮助:因为它需要一个 QGraphicsView 等等,因此设置起来并不容易。但是可以让它足够小以在此处发布。

标签: python pyside qgraphicsitem qgraphicsscene


【解决方案1】:

问题是你的第一个self.setPathself.setBrush 调用只是被第二个调用覆盖了。 QGraphicsPathItem 的这些属性在您到达绘制事件之前不会使用。所以第一个设置什么都不做,初始化后留在这些属性中的值是用于绘制项目的值。

做自己想做的事情并不太难,但你有很多选择,你需要根据你设计的其他方面来选择。

最简单的选择是只创建一个QGraphicsRectItem,然后给它一个QGraphicsSimpleTextItem 子级。这特别简单,因为您甚至不需要创建自己的子类:只需创建实例,设置它们的路径和画笔并直接使用它们。如果它可以满足您的需要,我强烈推荐这种方法。

    rectItem = QtGui.QGraphicsRectItem(0, 0, 130, 60)
    rectItem.setBrush(QtGui.QColor(255, 0, 0))

    textItem = QtGui.QGraphicsSimpleTextItem("Test!",rectItem)

    itemFont = QtGui.QFont()
    itemFont.setPointSize(40)
    textItem.setBrush( QtGui.QColor(200, 200, 200) )
    textItem.setFont(itemFont)
    textItem.setPos(10,0)

    self.view.scene().addItem( rectItem )

    rectItem.moveBy(100,100)

另一个简单的选择是创建这两个项目,然后将它们添加到QGraphicsItemGroup。如果您可能想要分离项目或单独使用它们,这是有道理的。

    rectItem = QtGui.QGraphicsRectItem(0, 0, 130, 60)
    rectItem.setBrush(QtGui.QColor(255, 0, 0))
    self.view.scene().addItem( rectItem )
    textItem = QtGui.QGraphicsSimpleTextItem("Test!")
    itemFont = QtGui.QFont()
    itemFont.setPointSize(40)
    textItem.setBrush( QtGui.QColor(200, 200, 200) )
    textItem.setFont(itemFont)
    textItem.setPos(10,0)
    self.view.scene().addItem( textItem )
    group = QtGui.QGraphicsItemGroup()
    group.addToGroup(rectItem)
    group.addToGroup(textItem)
    group.moveBy(100,100)
    self.view.scene().addItem( group )

如果您出于其他原因需要创建自己的类,那么您有很多选择。最通用的是子类QGraphicsItem。您可以使用例如两个路径和两个画笔创建MyTextItem,并在绘制项目时同时使用它们。您将必须实现boundingRectpaint,但在这种情况下,两者都将非常容易。如果您预计会为该项目添加大量附加功能,这可能是一个不错的选择。

其他选项是继承QRectItem 并为其添加文本路径。同样,您将需要重新实现paint,但这可能就是所需要的。或者你可以继承QSimpleTextItem 并添加一个矩形。

【讨论】:

  • 我希望坚持使用QGraphicsPathItem 以将所有内容都放在一个类中,但这对我来说看起来不错。感谢您的精彩解释!
  • QGraphicsPathItem 根据自己的 Path 和 Brush 进行绘制。所以唯一的办法就是重写paint和boundingRect。但是其他各种方法也会很奇怪,例如 setPath。包含,等等。这真的没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2018-10-12
  • 2016-07-13
  • 2019-03-08
  • 1970-01-01
相关资源
最近更新 更多