QGraphicsPathItem 不同的颜色
QGraphicsPathItem different colors
有没有办法为单个 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
。或者更好的是,一种为文本提供背景的方法,这样更容易 select.
更新
举个例子。我想要红色背景的白色文本,但我只得到最后使用的画笔颜色。
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()
问题是您的第一个 self.setPath
和 self.setBrush
调用只是第二个调用 over-ridden。 QGraphicsPathItem
的这些属性在您到达绘画事件之前不会被使用。所以第一个设置什么都不做,初始化后留在这些属性中的值是用于绘制项目的值。
做自己想做的事情并不太难,但是你有很多选择,你需要根据你设计的其他方面来选择。
最简单的选择是只创建一个 QGraphicsRectItem
,然后给它一个 QGraphicsSimpleTextItem
child。这特别简单,因为您甚至不需要创建自己的子class:只需创建实例、设置它们的路径和画笔并直接使用它们。如果它能满足您的需求,我强烈推荐这种方法。
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 )
如果您出于其他原因需要创建自己的 class,那么您有多种选择。最一般的会是subclass QGraphicsItem
。例如,您可以使用两个路径和两个画笔创建 MyTextItem
,并在绘制项目时同时使用它们。您将不得不实施 boundingRect
和 paint
但在这种情况下两者都非常容易。如果您预见到要为该项目添加许多附加功能,这可能是一个不错的选择。
其他选项是子class QRectItem
并向其添加文本路径。同样,您将需要 re-implement paint
,但这可能就是所需要的全部。或者您可以子 class QSimpleTextItem
并向其添加一个矩形。
有没有办法为单个 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
。或者更好的是,一种为文本提供背景的方法,这样更容易 select.
更新
举个例子。我想要红色背景的白色文本,但我只得到最后使用的画笔颜色。
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()
问题是您的第一个 self.setPath
和 self.setBrush
调用只是第二个调用 over-ridden。 QGraphicsPathItem
的这些属性在您到达绘画事件之前不会被使用。所以第一个设置什么都不做,初始化后留在这些属性中的值是用于绘制项目的值。
做自己想做的事情并不太难,但是你有很多选择,你需要根据你设计的其他方面来选择。
最简单的选择是只创建一个 QGraphicsRectItem
,然后给它一个 QGraphicsSimpleTextItem
child。这特别简单,因为您甚至不需要创建自己的子class:只需创建实例、设置它们的路径和画笔并直接使用它们。如果它能满足您的需求,我强烈推荐这种方法。
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 )
如果您出于其他原因需要创建自己的 class,那么您有多种选择。最一般的会是subclass QGraphicsItem
。例如,您可以使用两个路径和两个画笔创建 MyTextItem
,并在绘制项目时同时使用它们。您将不得不实施 boundingRect
和 paint
但在这种情况下两者都非常容易。如果您预见到要为该项目添加许多附加功能,这可能是一个不错的选择。
其他选项是子class QRectItem
并向其添加文本路径。同样,您将需要 re-implement paint
,但这可能就是所需要的全部。或者您可以子 class QSimpleTextItem
并向其添加一个矩形。