Seite 1 von 1

Diagramm gitter

Verfasst: 27. November 2011 20:08
von Erni35
Hallo Leute,

ich habe ein kleines Problem, eine Herausforderung.
Ich zeichne in einem QImage mittels QPainter ein Gitter. Dies soll an den Schnittpunkten teilweise gelöst werden, damit dort die Beschriftung geschrieben werden kann. Dies ganze soll auf transparentem Hintergrund erfolgen, da ich dieses Gitter mit Beschriftung dann auf ein anderes Painter-Objekt übertrage. Auf diesem Sind die Graphen mit gefüllten Flächen dargestellt. Diese Flächen sollen durch die Beschriftung scheinen, aber eben nicht die Gitterlinien,

Code: Alles auswählen

QImage *testbild = new QImage(2 * screen_i_half_side,2 * screen_i_half_side,QImage::Format_ARGB32);
    testbild->fill(Qt::transparent);

    QPainter *testpainter;
    testpainter = new QPainter();
    testpainter->begin(testbild);
    testpainter->setBackground(Qt::transparent);
    testpainter->setPen(QPen(line2_color, 2, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin));
    testpainter->drawLine(0, 0, testbild->width(), testbild->height());  //Testlinie
    testpainter->setBrush(Qt::NoBrush);
    testpainter->eraseRect(QRectF(300, 300, 200, 100)); // in dieses Rechteck soll die Beschriftung geschrieben werden...
    testpainter->end();

    testbild->save("testbild.png", "PNG");

    painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter->drawImage(QPointF(-screen_i_half_side, 0), *testbild);
Leider habe ich nach dem Transfer entweder ein schwarzes Rechteck, oder der diagonale Strich ist nicht gelöscht...


Könnt ihr mir helfen?

Erni35

Re: Diagramm gitter

Verfasst: 28. November 2011 07:11
von Christian81
Das PNG sieht bei mir korrekt aus. Allerdings erzeugst du ohne Not zwei Memleaks und da dies in jedem PaintEvent passiert... warum das Image und den Painter nicht auf de Stack anlegen bzw. warum löscht Du die Pointer nicht wieder?

typo korrigiert: s/Heap/Stack/

Re: Diagramm gitter

Verfasst: 28. November 2011 20:52
von Erni35
weil doch gcc nicht mehr benötigte Objekte wieder freigibt.
Dachte ich.

Wie lege ich QImage auf dem heap ab und reicht dann ein free() zum Zeiger löschen?

Erni35

Re: Diagramm gitter

Verfasst: 28. November 2011 21:35
von Christian81
Erni35 hat geschrieben:weil doch gcc nicht mehr benötigte Objekte wieder freigibt.
Dachte ich.
Dann würde ich sagen - nimm ein C++ Buch und lern erstmal C++ bevor Du mit Qt anfängst - sorry aber ohne Grundlagen wird das nicht wirklich was sinnvolles
Erni35 hat geschrieben: Wie lege ich QImage auf dem heap ab und reicht dann ein free() zum Zeiger löschen?
Ich meinte Stack - auf den Heap erzeugst Du es ja jetzt schon und vergisst es zu löschen...

Re: Diagramm gitter

Verfasst: 28. November 2011 22:18
von DBGTMaster
Erni35 hat geschrieben:weil doch gcc nicht mehr benötigte Objekte wieder freigibt.
Dachte ich.

Wie lege ich QImage auf dem heap ab und reicht dann ein free() zum Zeiger löschen?

Erni35
Zeiger werden nie automatisch gelöscht (netterweise übernimmt QT an vielen Stellen das löschen des Zeigers). Ansonsten musst du bei jedem new auch ein delete aufrufen.

Ausnahmen sind shared_ptr oder dergleichen.

Re: Diagramm gitter

Verfasst: 28. November 2011 22:26
von Erni35
zumindest habe ich mich jetzt ein wenig zu Stack und Heap belesen...

Ich habe den Code nur in eine bestehende Routine eingebaut, um ihn schnell auszuprobieren.
Da sind mir die Orte der Variablen erstmal egal.

Neben den berechtigten Speicherhinweisen (ich kontrolliere meine Programmzeilen daraufhin!), wie kann ich diese Löschaufgabe erledigen?
Male ich ein Viereck mit dem Hintergrund-Pinsel passiert nichts. Mit nem transparenten Pinsel zu malen, jaja.
Ich könnte auch mit einem weissen Hintergrund anfangen, nur wie ändere ich die weiße Fläche in eine transparente?

Erni35

Re: Diagramm gitter

Verfasst: 28. November 2011 23:21
von solarix
Mit dem QPainter habe ich es auf Anhieb auch nicht hingekriegt. Evt. findest du ja noch eine elegantere Lösung mit dem Painter, aber der harte Umweg funktioniert tadellos:

Code: Alles auswählen

#include <QImage>
#include <QPainter>

int main(int, char *[])
{
  QImage img(500,500,QImage::Format_ARGB32);

  QPainter p(&img);
  p.fillRect(img.rect(),Qt::green);

  // transparentes Rechteck erzeugen
  for (int x=50; x<100; x++)
    for (int y=50; y<100; y++)
      img.setPixel(x,y,Qt::transparent);

  p.setBrush(Qt::red);
  p.drawLine(0,0,200,200);

  img.save("test.png");
  return 0;
}

hth..

Re: Diagramm gitter

Verfasst: 29. November 2011 06:35
von Christian81
Siehe QPainter::setCompositionMode()

Re: Diagramm gitter

Verfasst: 30. November 2011 11:14
von Erni35
Danke,
funktioniert.

Bis demnächst.