Почему нельзя добавить элемент в QGraphicsScene из QVector <QGraphicsItem>? - PullRequest
1 голос
/ 23 марта 2019

Я хочу, чтобы отменить или повторить действия в QGraphicsScene, что связано с QGraphicsView: Для этого я использую QGraphicsEllipse (для рисования точек во время движения и нажав на QGraphicsView) в мой mouseMoveEvent метод, я нажимаю каждый QGraphicsEllipse в QVector<QGraphicsItem>, а когда QAction «отмена» запускается программа должна удалить последние эллипсы (определенное число эллипсов), нарисованные в моих QGraphicsView благодаря моей QGraphicsScene.

1012 * Когда я прочистить QGraphicsScene и попытаться добавить все QGraphicsItems, которые были вытеснены в моей QVector<QGraphicsItem>, я получил сообщение об ошибке: мое приложение идет вниз
    if(index < historyIndex.size()){
        for (int i = 0; i < scHistory.size() - historyIndex[index]; i++){
            scene->addItem((QGraphicsItem*)scHistory[i]);
         }
        index++;
    }

    QVector<QGraphicsItem *> scHistory;

1 Ответ

1 голос
/ 24 марта 2019

QGraphicsScene::addItem принимает право собственности на добавленный элемент, отметьте doc . Это означает, что теперь он отвечает за уничтожение элемента, что происходит, когда вы очищаете сцену с помощью QGraphicsScene::clear. С этого момента ваш вектор полон висячих указателей.

Одним из быстрых решений является замена вызова на QGraphicsScene::clear удалением элементов вручную через QGraphicsScene::removeItem, который не уничтожает элемент (он возвращает право собственности вызывающей стороне). Затем уничтожьте только те элементы, которые действительно находятся вне сцены, и добавьте остальные. Другой вариант, более эффективный, состоит в том, чтобы удалить только те элементы, которые вам нужны, оставив оставшиеся, чтобы вы также увеличили производительность, избегая добавления большого количества элементов из истории.

Без полного знания вашего кода вторыми параметрами могут быть что-то вроде:

if(_indexHistoryRoam < _indexHistory.size()){
    // Remove only items beyond history
    const int range = _sceneHistory.size() - _indexHistory[_indexHistoryRoam];
    for (int i = range; i < _sceneHistory.size(); i++){
        scene->removeItem((QGraphicsItem*)_sceneHistory[i]);
        delete _sceneHistory[i]; // item must be destroyed to avoid a leak
     }
    _indexHistoryRoam++;
} else { // force removal of all elements
    scene->clear();
}
scene->update();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...