Qt wyciek graphic scene

0

Witam,
mam straszny wyciek pamięci przy rysowaniu na scenie, próbowałem czyścić nawszelkie mi znane sposoby , ale nic nie pomogło.

Fragment kodu:

QPolygonF poziom;
poziom.append(QPointF(70./-80));
poziom.append(QPointF(-70./-80));
poziom = matrix.map(poziom);
scene->addPolygon(poziom,pen);
 

i tak kilkadziesiąt wielokątów. Podpowie ktoś jak pozbyć się tego wycieku?

[Edit]

Może dokładniej, mam straszny wyciek podczas rysowanie masy wielokątów aktualnie przy pomocy QPainEvent (we własnej funkcji także połyka coraz więcej pamięci)
Prawie pełen kod:


void Widget::painEvent (QPanitEvent *e)
{
scene = new QGraphicsScene();
ui->graphicsViev->setScene(scene);

QMatrix matrix;
matrix.rotate(kat);

QColor brown(184,99,14);
QBrush brownBrush (brown);
QPen brownpen (brown);

//i jeszcze kilka innych kolorów, wypełnień i pisaków już bardziej wymyślnych


QPolygonF poziom;
poziom.append(QPointF(70./-80));
poziom.append(QPointF(-70./-80));
poziom = matrix.map(poziom);
scene->addPolygon(poziom,pen);

QPolygonF pion;
pion.append(QPointF(70./-80+i));
pion.append(QPointF(-70./-80+i));
pion = matrix.map(poziom);
scene->addPolygon(pion,pen);

// i jeszcze kilkadziesiąt bardziej skomplikowanych  wielokątów

QPainterPath path;

QFont font;
font.setPixelSize (12);
font.setBold(false);
font.setFamily("Arial");

path.addText(-92, -76, font, QString::number(-40));
path = matrix.map(path);
scene->addPath(path, brownpen, brownbrush);

// i jeszcze kilkanaście innych napisików

QRectF rect (10, 10, 10, 10);

for(j=0; j<h; j++)
{
    scene->addrect(rect, brownpen, brownbrush);
}
}


chyba wszystko uwzględniłem nie ma bardzo w czym byka zrobić, ale jednak jak potrafię:)
Jak barkuje jakich ; , {} (), są literówy to wybaczcie na szybko ręcznie klepane.

2

problemem jest brak zrozumienia API! W void Widget::painEvent (QPanitEvent *e), która jako metoda rysująca jest wywoływana wiele razy, używasz scene->addPolygon(pion,pen);, które dodaje obiekty polygo do sceny, a te będą żyły tak długo jak scena.
Efekt jest taki, że zalewasz sceną wieloma obiektami.
W paint event nie wolno ci dodawać obiektów do sceny. Powinieneś tylko tam rysować używając obiektu QPainter.
Na dodatek, tworzysz tą scenę za każdym razem? Scena powinna być jedna i być przypisana do QGraphicsView.

Czemu masz paint event z QWidget kiedy chcesz używać QGraphicsScene? Robisz coś totalnie źle!

Moja rada doczytaj podstawowe tutoriale zanim się weźmiesz za QGraphicsScene, bo nie rozumiesz podstaw tego API.

0
MarekR22 napisał(a):

W void Widget::painEvent (QPanitEvent *e), która jako metoda rysująca jest wywoływana wiele razy

To wiem, dlatego użyłem jej do testów, pierwtnie ten kod był wywoływany po odebraniu danych z rs-a, ale żarł pamiec i dlatego do testów w paintevent władowałem wiem że odpowiednie miejsce ;p;p;p pewnie dlatego schodki się zaczęły:).

MarekR22 napisał(a):

używasz scene->addPolygon(pion,pen);, które dodaje obiekty polygo do sceny, a te będą żyły tak długo jak scena.
Efekt jest taki, że zalewasz sceną wieloma obiektami.
W paint event nie wolno ci dodawać obiektów do sceny. Powinieneś tylko tam rysować używając obiektu QPainter.

I to był ten błąd, hehe wiedziałem że jakaś głupota. Idę na urlop i odpuszczam na ten czas programowanie, może jak wypocznę to zacznę logicznie myśleć.

MarekR22 napisał(a):

Na dodatek, tworzysz tą scenę za każdym razem? Scena powinna być jedna i być przypisana do QGraphicsView.

tego tam nie ma w oryginale, sam nie wiem czemu wrzuciłem do painta

MarekR22 napisał(a):

Moja rada doczytaj podstawowe tutoriale zanim się weźmiesz za QGraphicsScene, bo nie rozumiesz podstaw tego API.

Pewnie nie zaszkodzi.

Dzięki, znając życie nie dopatrzył bym sie tego, a najlepsze że 2 pierwsze sceny działają bezbłędnie:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1