首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGraphicsPathItem不同颜色

QGraphicsPathItem不同颜色
EN

Stack Overflow用户
提问于 2015-09-02 06:06:40
回答 1查看 1.3K关注 0票数 0

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

例如:

代码语言:javascript
复制
    # 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。或者更好的是,一种给文本提供背景的方法,这样更容易选择。

更新

下面是一个例子。我想要一个红色背景的白色文本,但我只得到最后使用的刷子颜色。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-07 22:36:55

问题是您的第一个self.setPathself.setBrush调用只是被第二个调用覆盖。在到达QGraphicsPathItem事件之前,不会使用这些属性。因此,第一个设置不起任何作用,初始化后这些属性中留下的值就是用于绘制项的值。

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

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

代码语言:javascript
复制
    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中。如果您想分离项目或单独使用它们,这是有意义的。

代码语言:javascript
复制
    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并在其中添加一个rect。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32345714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档