【问题标题】:Removing QGraphicsSimpleTextItem from QGraphicsView's Scene not working从 QGraphicsView 的场景中删除 QGraphicsSimpleTextItem 不起作用
【发布时间】:2021-08-10 13:11:42
【问题描述】:

作为我的宠物项目的一部分,我需要在 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))

【问题讨论】:

    标签: python pyqt5 qgraphicsview qgraphicsscene qgraphicstextitem


    【解决方案1】:

    只有基本形状 add*() 函数返回一个项目(addRect()addLine() 等),因为它们用于创建新项目。

    addItem() 添加一个 existing 项,它返回None(返回一个作为函数参数的对象没有意义),那么问题就在这里(我添加了一个打印语句以显示结果):

    items[i] = scene.addItem(txt_)
    print(items[i])
    

    如您所见,您实际上是在添加 None 作为字典值,然后尝试从场景中移除 nothing,因此这些项目实际上仍保留在场景中。

    您需要将项目添加到字典中,就像您在第二个示例中所做的那样。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2014-09-02
      • 2013-08-23
      • 2015-04-28
      • 2023-03-12
      相关资源
      最近更新 更多