Рисование на QGraphicsScene без потери уже изображения на нем. Переполнение стека Qt

Так что, как говорится в вопросе, у меня есть QGraphicsView на мой интерфейс. Я сделал функцию, которая помещает изображение в этот QGraphicsView:

// Read New Image from file
QImage image(":/images/myFile.png");

/// Declare a pointer to a scene
QGraphicsScene *scene = new QGraphicsScene();

// add a pixmap to the scene from the QImage 'image'
scene->addPixmap(QPixmap::fromImage(image));

// set the scene to equal the height and width of the map image
scene->setSceneRect(0,0,image.width(),image.height());

// Set the Scene to the GraphicsView on the UI
ui->graphicsView->setScene(scene);

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

    for(unsigned int i = 0; i < pixels.size(); i++)
{
x = pix_iter->second;
y = pix_iter->first;

scene->addEllipse(x, y, 1, 1, pen, QBrush(Qt::SolidPattern));

pix_iter++;
}
ui->graphicsView->setScene(scene);

Во всяком случае, я не знаю, что делать, чтобы просто обновить сцену, чтобы добавить точки к ней, а не просто установить новую

Любая помощь могла бы быть полезна.

0

Решение

Во втором фрагменте вы воссоздаете сцену? Почему бы не использовать ui->graphicsView->scene() и добавить точки к нему?

3

Другие решения

Пока вы работаете с одним и тем же указателем сцены, вы можете вызывать setScene столько раз, сколько захотите (хотя это ничего не меняет). Итак, первое, что нужно понять, это то, что QGraphicsScene на самом деле модель QGraphicsView, так что вы должны либо объявить его глобально (в зависимости от дизайна приложения), либо использовать метод scene (), как предложено в предыдущем ответе.

Вызов scene () для представления — это, конечно, решение, но я предпочитаю, чтобы указатели модели были доступны через мои собственные классы, а не через методы представления. Это потому, что иногда вы хотите поделиться представлением, чтобы показать разные модели в зависимости от состояния / логики приложения. Поэтому, если что-то нужно добавить к сцене, вы должны быть уверены, с какой сценой вы работаете.

2

По вопросам рекламы [email protected]