Как удалить QGraphicsItem в Pyqt5 - PullRequest
       44

Как удалить QGraphicsItem в Pyqt5

0 голосов
/ 01 августа 2020

Я пытаюсь узнать, как удалить QGraphicsItem с помощью python. В настоящее время я использую scene.removeItem(item), чтобы удалить элемент из QGraphicsScene. Однако удаляет ли это элемент (из памяти)?

Если нет, есть ли способ сделать это? Совершит ли ключевое слово del это sh? Извините, я новичок в этом, поэтому буду благодарен за любой совет / отзыв.

Ответы [ 2 ]

1 голос
/ 01 августа 2020

При добавлении элемента в сцену тот, который управляет памятью элемента, больше не python, а сцена, но когда вы используете removeItem(), он не удаляет его из памяти, а возвращает право владения элементом python, и в этом случае python удалите его, когда это будет сочтено необходимым, чтобы убедиться, что я создал простой пример:

from PyQt5 import QtCore, QtWidgets


class GraphicsRectItem(QtWidgets.QGraphicsRectItem):
    def __del__(self):
        print("deleted")


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent=parent)

        self.scene = QtWidgets.QGraphicsScene()
        self.view = QtWidgets.QGraphicsView(self.scene)
        self.setCentralWidget(self.view)

        item = GraphicsRectItem(10, 10, 100, 100)
        self.scene.addItem(item)

        QtCore.QTimer.singleShot(1000, lambda: self.scene.removeItem(item))


def main():
    import sys

    app = QtWidgets.QApplication(sys.argv)

    mytable = MainWindow()
    mytable.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

Если вы хотите явно удалить из памяти объект C ++ (не python объект), то вы можете использовать sip:

from PyQt5.QtWidgets import QGraphicsScene
# sip should be imported after pyqt5
import sip
# ...
scene.removeItem(item)
sip.delete(item)
0 голосов
/ 01 августа 2020

В python есть Entity, который называется GarbageCollector (G C), который заботится о «хранении» удаленных объектов для каждого объекта, вы можете прочитать больше в docs для подробностей .

Значения объектов вашей программы хранятся в памяти для быстрого доступа. Во многих языках программирования переменная в вашем программном коде - это просто указатель на адрес объекта в памяти. Когда переменная используется в программе, процесс будет читать значение из памяти и работать с ним. В ранних языках программирования разработчики несли ответственность за управление памятью в своих программах. Это означало, что перед созданием списка или объекта вам сначала нужно было выделить память для вашей переменной. После того, как вы закончили работу с переменной, вам нужно было освободить ее, чтобы «освободить» эту память для других пользователей. Сборщик мусора Python является автоматическим c распределителем памяти, избавляя от необходимости делать это самостоятельно.

Использование свойства __del__ объекта приведет только к отсоединению имени переменной от самого объекта, но на самом деле объект не будет сброшен из памяти, он будет перехвачен сборщиком мусора, который позволит очистить объект, если G C сочтет это необходимым.

To flu sh сборщик мусора, вы можете использовать python модуль gc. метод collect() очищает память сборщика мусора.

import gc
gc.collect()

просмотрите этот поток для получения дополнительной информации о сборке мусора.

...