Diagramm gitter

Alles rund um die Programmierung mit Qt
Antworten
Erni35
Beiträge: 15
Registriert: 21. Juli 2009 21:49

Diagramm gitter

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Diagramm gitter

Beitrag 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/
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Erni35
Beiträge: 15
Registriert: 21. Juli 2009 21:49

Re: Diagramm gitter

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Diagramm gitter

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: Diagramm gitter

Beitrag 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.
Erni35
Beiträge: 15
Registriert: 21. Juli 2009 21:49

Re: Diagramm gitter

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Diagramm gitter

Beitrag 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..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Diagramm gitter

Beitrag von Christian81 »

Siehe QPainter::setCompositionMode()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Erni35
Beiträge: 15
Registriert: 21. Juli 2009 21:49

Re: Diagramm gitter

Beitrag von Erni35 »

Danke,
funktioniert.

Bis demnächst.
Antworten