从 QGraphicsView 的场景中删除 QGraphicsSimpleTextItem 不起作用
Removing QGraphicsSimpleTextItem from QGraphicsView's Scene not working
作为我的宠物项目的一部分,我需要在 QGraphicsScene 中添加和删除文本。但是由于某种原因,我无法以与删除多边形相同的方式删除 QGraphicsSimpleTextItems,即使用指针创建它们,并使用 scene.removeItem(item_name).
请在下面找到一个最小可重现的示例来复制我在从屏幕上删除 QGraphicsSimpleTextItems 时遇到的问题。
我哪里错了?谢谢!
import sys
from PyQt5.QtGui import QBrush,QPen,QColor
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsSimpleTextItem
def main():
app = QApplication(sys.argv)
items = {}
colors_rgb = [[8, 247, 254], [254, 83, 187], [255, 170, 1], [86, 10, 134], [117, 213, 253],
[255, 34, 129], [128, 255, 0], [2, 184, 166]]
positions_ = [[100,200],[10,200],[120,503],[150,400],[300,150],[150,230],[530,20],[400,200]]
text_ =["textitem_1","textitem_2","textitem_3","textitem_4","textitem_5","textitem_6","textitem_7","textitem_8"]
scene = QGraphicsScene()
view = QGraphicsView(scene)
for i in range(len(text_)):
txt_ = QGraphicsSimpleTextItem(text_[i])
txt_.setPos(positions_[i][0],positions_[i][1])
txt_.setPen(QPen(QColor(0,0,0)))
txt_.setBrush(QBrush(QColor(colors_rgb[i][0],colors_rgb[i][1],colors_rgb[i][2])))
items[i] = scene.addItem(txt_)
scene.removeItem(items[i])
view.resize(640, 480)
view.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
编辑
我发现如果将 QGraphicsSimpleTextItem 本身添加到字典中,而不是使用指针,我可以毫无问题地删除项目。为什么会这样?
for i in range(len(text_)):
txt_ = QGraphicsSimpleTextItem(text_[i])
txt_.setPos(positions_[i][0],positions_[i][1])
txt_.setPen(QPen(QColor(0,0,0)))
txt_.setBrush(QBrush(QColor(colors_rgb[i][0],colors_rgb[i][1],colors_rgb[i][2])))
scene.addItem(txt_)
items[i] = txt_
for i in range(len(text_)):
scene.removeItem(items.get(i))
只有基本形状 add*()
对项目(addRect()
、addLine()
等)起作用 return,因为它们用于创建 新项目。
addItem()
添加一个 现有的 项目,并且它 returns None
(return 没有意义object 是函数的参数),那么问题就在这里(我添加了一个打印语句来显示结果):
items[i] = scene.addItem(txt_)
print(items[i])
如您所见,您实际上是在添加 None
作为字典值,然后尝试从场景中删除 nothing,因此项目实际上保留在现场。
您需要将项目添加到字典中,就像您在第二个示例中所做的那样。
作为我的宠物项目的一部分,我需要在 QGraphicsScene 中添加和删除文本。但是由于某种原因,我无法以与删除多边形相同的方式删除 QGraphicsSimpleTextItems,即使用指针创建它们,并使用 scene.removeItem(item_name).
请在下面找到一个最小可重现的示例来复制我在从屏幕上删除 QGraphicsSimpleTextItems 时遇到的问题。
我哪里错了?谢谢!
import sys
from PyQt5.QtGui import QBrush,QPen,QColor
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsSimpleTextItem
def main():
app = QApplication(sys.argv)
items = {}
colors_rgb = [[8, 247, 254], [254, 83, 187], [255, 170, 1], [86, 10, 134], [117, 213, 253],
[255, 34, 129], [128, 255, 0], [2, 184, 166]]
positions_ = [[100,200],[10,200],[120,503],[150,400],[300,150],[150,230],[530,20],[400,200]]
text_ =["textitem_1","textitem_2","textitem_3","textitem_4","textitem_5","textitem_6","textitem_7","textitem_8"]
scene = QGraphicsScene()
view = QGraphicsView(scene)
for i in range(len(text_)):
txt_ = QGraphicsSimpleTextItem(text_[i])
txt_.setPos(positions_[i][0],positions_[i][1])
txt_.setPen(QPen(QColor(0,0,0)))
txt_.setBrush(QBrush(QColor(colors_rgb[i][0],colors_rgb[i][1],colors_rgb[i][2])))
items[i] = scene.addItem(txt_)
scene.removeItem(items[i])
view.resize(640, 480)
view.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
编辑
我发现如果将 QGraphicsSimpleTextItem 本身添加到字典中,而不是使用指针,我可以毫无问题地删除项目。为什么会这样?
for i in range(len(text_)):
txt_ = QGraphicsSimpleTextItem(text_[i])
txt_.setPos(positions_[i][0],positions_[i][1])
txt_.setPen(QPen(QColor(0,0,0)))
txt_.setBrush(QBrush(QColor(colors_rgb[i][0],colors_rgb[i][1],colors_rgb[i][2])))
scene.addItem(txt_)
items[i] = txt_
for i in range(len(text_)):
scene.removeItem(items.get(i))
只有基本形状 add*()
对项目(addRect()
、addLine()
等)起作用 return,因为它们用于创建 新项目。
addItem()
添加一个 现有的 项目,并且它 returns None
(return 没有意义object 是函数的参数),那么问题就在这里(我添加了一个打印语句来显示结果):
items[i] = scene.addItem(txt_)
print(items[i])
如您所见,您实际上是在添加 None
作为字典值,然后尝试从场景中删除 nothing,因此项目实际上保留在现场。
您需要将项目添加到字典中,就像您在第二个示例中所做的那样。