Seite 1 von 1

Hintergrundbild PixMap Problem

Verfasst: 26. Oktober 2008 18:57
von WingMan
Hallo alle zusammen,

habe eine GraphicsView in der ich ein selbst gezeichnetes QPixmap als Hintergrund anzeigen lasse. Nun wird das Pixmap allerdings so oft wiederholt, bis die gesamte View voll ist. Ich möchte allerdings, dass das Hintergrundbild nur genau einmal eingefügt wird und zwar am oberen linken Rand der View ausgerichtet.

Gibt es dafür eine Möglichkeit ? Ich konnte in der API von QGraphicsView nicht derartiges finden.

Vielen Dank und viele Grüße
WingMan

Verfasst: 27. Oktober 2008 14:17
von WingMan
Ist denn meine Frage nun einfach zu leicht :oops: oder ist das wirklich nicht möglich, dass das Hintergrundbild sich nicht so oft wiederholt bis die View voll ist ? Suche die ganze Zeit nach einer Lösung, kann aber keine finden :evil: :evil: :evil: :evil:

Viele Grüße
WingMan

Verfasst: 27. Oktober 2008 16:36
von Ginsengelf
Moin, ich habe mich jetzt nicht in QGraphicsView vertieft, aber zur Not kannst du dein Bild doch einfach vor dem Malen auf die Größe des Views skalieren (falls du es vollflächig haben möchtest).

Ginsengelf

Verfasst: 27. Oktober 2008 16:40
von mathies
Hallo, füg doch einfach Dein Hintergrundbild als QGraphicsPixmapItem ein und setz das zValue auf einen niedrigen Wert z.B. -10, damit stellst Du sicher, das alles andere davor gezeichnet wird.

Verfasst: 27. Oktober 2008 16:49
von WingMan
Hi,

Danke für den Vorschlag.

Hatte es zuvor ähnlich gelöst. Das Problem daran ist, dass dann das Pixmap bei jeder Aktualisierung der Scene mit aktualisiert werden würde. Da das Pixmap recht groß ist und innerhalb der Scene mit Drag&Drop Items verschoben werden (wonach die Scene jeweils aktualisiert wird), bremst diese Möglichkeit das Ganze leider stark aus. Setze ich es als Background könnte ich diesen cachen und zusätzlich lediglich die Items in der Scene aktualisieren. (Zumindest habe ich mir das so gedacht :roll: ).

Trotzdem vielen Dank für Deine Antwort!

Gruß
WingMan

Verfasst: 27. Oktober 2008 16:57
von mathies
Stimmt, darüber habe ich noch gar nicht nachgedacht. Habe eine Ähnliche Anwendung, in der ich es wie beschrieben realisiert habe. Alternativ könntest Du aber die Scene nur ein einem bestimmten Bereich aktualisieren, nämlich den, in dem Du arbeitest bzw. den Du verändert hast z.B. über das boundingRect von einem Item.

Nichts desto trotz würde mich die andere Lösung aber auch sehr interessieren, weil das mich dem Cachen interessant klingt :)

Verfasst: 27. Oktober 2008 19:19
von upsala
Man könnte das Pixmap auch selbst mit drawBackground vom QGraphicsView oder vom QGraphicsScene selbst zeichnen. Wenn das übergebene QRectF berücksichtigt wird, sollte das performant genug sein.

Verfasst: 28. Oktober 2008 17:28
von WingMan
Dank upsala,

werde es so mal ausprobieren!


edit: Hab es nun mal getestet und es funktioniert genau so wie ich es haben wollte. Übergebe nun einfach als rect das scenerect und schon ist alles toll :P Also nochmals Danke!


Viele Grüße
WingMan

Verfasst: 1. November 2008 19:23
von WingMan
Ich muss leider den Thread noch einmal herauf holen. Und zwar hat sich soeben bei der Lösung ein Problem aufgetan.

Und zwar: Ich brauche eine Möglichkeit um sehr viele Linien (Anzahl ist dynamisch, sollen allerdings ein paar 1000 werden können) effizient im Hintergrund darstellen zu können. Die Linien sind allesamt nicht sonderlich lang (nur wenige Zentimeter).

Bisher habe ich es mittels des PixMap (wie oben beschrieben) gelöst. Aber: Werden es mehr als ungefähr 600 oder 650 Linien bekommen ich nur noch folgenden Fehlermeldungen:

Code: Alles auswählen

X Error: BadAlloc (insufficient resources for operation) 11
  Major opcode: 53 (X_CreatePixmap)
  Resource id:  0x13b
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Extension:    156 (RENDER)
  Minor opcode: 4 (RenderCreatePicture)
  Resource id:  0x480012e
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 55 (X_CreateGC)
  Resource id:  0x480012e
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 56 (X_ChangeGC)
  Resource id:  0x4800130
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 70 (X_PolyFillRectangle)
  Resource id:  0x480012e
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 60 (X_FreeGC)
  Resource id:  0x4800130
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 55 (X_CreateGC)
  Resource id:  0x480012e
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 55 (X_CreateGC)
  Resource id:  0x480012e
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 58 (X_SetDashes)
  Resource id:  0x4800131
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 56 (X_ChangeGC)
  Resource id:  0x4800131
X Error: RenderBadPicture (invalid Picture parameter) 179
  Extension:    156 (RENDER)
  Minor opcode: 5 (RenderChangePicture)
  Resource id:  0x480012f
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 56 (X_ChangeGC)
  Resource id:  0x4800132
X Error: RenderBadPicture (invalid Picture parameter) 179
  Extension:    156 (RENDER)
  Minor opcode: 5 (RenderChangePicture)
  Resource id:  0x480012f
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 56 (X_ChangeGC)
  Resource id:  0x4800131
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 56 (X_ChangeGC)
  Resource id:  0x4800132
X Error: RenderBadPicture (invalid Picture parameter) 179
  Extension:    156 (RENDER)
  Minor opcode: 5 (RenderChangePicture)
  Resource id:  0x480012f
X Error: RenderBadPicture (invalid Picture parameter) 179
  Extension:    156 (RENDER)
  Minor opcode: 5 (RenderChangePicture)
  Resource id:  0x480012f
X Error: RenderBadPicture (invalid Picture parameter) 179
  Extension:    156 (RENDER)
  Minor opcode: 25 (RenderCompositeGlyphs32)
  Resource id:  0x480012f
X Error: RenderBadPicture (invalid Picture parameter) 179
  Extension:    156 (RENDER)
  Minor opcode: 5 (RenderChangePicture)
  Resource id:  0x480012f
X Error: RenderBadPicture (invalid Picture parameter) 179
  Extension:    156 (RENDER)
  Minor opcode: 10 (RenderTrapezoids)
  Resource id:  0x480012f
Und von der Sorte noch so ein paar Hundert mehr...

Bin ratlos. Muss es aber irgendwie realisiert bekommen, daher wäre wiedereinmal für Tipps und Tricks sehr dankbar :roll:

Vielen Dank und noch ein schönes WE
WingMan

Verfasst: 3. November 2008 20:55
von WingMan
Da bin ich mal wieder...

Da ich keine Lösung für mein Problem finde, versuche ich es mal über einen anderen Ansatz. Allerdings komme ich auch da nicht besonders weit. Mir fehlt eine Möglichkeit, ein Hintergrundbild an einer bestimmten Position in der QGraphicsView zu positionieren.
Ich würde also z.B. gerne ein PixMap an einer bestimmten Stelle in der View als Background beginnen lassen. Ist das möglich?
Leider kann ich nicht das PixMap verändern, da es bereits bestimmte Voraussetzungen erfüllt, die mir eine Abänderung unmöglich machen :evil:

Vielen Dank und viele Grüße
WingMan

Verfasst: 4. November 2008 16:40
von WingMan
Anscheinend gibt es wohl keine Methode die es ermöglicht ein Hintergrundbild an bestimmten Koordinaten zu platzieren :cry:

Gibt es denn noch Alternativen um einen riesigen Hintergrund effektiv einzubinden außer über ein PixMap? Anscheinend ist mein Hintergrund wohl so groß, dass er zu groß für das PixMap wird...

Bin für jeden Anreiz dankbar,

viele Grüße
WingMan

Verfasst: 4. November 2008 19:11
von upsala
Man konnt doch bei drawPixmap eine Position mit angeben...

Verfasst: 4. November 2008 19:29
von WingMan
Hallo!
Bei drawPixmap kann man das mit angeben, aber das rufe ich ja nie so direkt auf. Das Pixmap ist ja als Hintergrundbild gesetzt und ich setze es mit

Code: Alles auswählen

setBackgroundBrush
Oder ist das der Fehler? Sehe aber leider mal wieder keine Möglichkeit das Pixmap mittels drawPixmap in den Hintergrund zu zeichnen :oops: :cry:

Vielen Dank schon einmal für Deine Antwort und falls Du da eine Lösung siehst, ich kenne da einen sehr dankbaren Abnehmer :D

Viele Grüße
und einen schönen Abend
WingMan

Verfasst: 4. November 2008 19:48
von upsala
Die Möglichkeit habe ich schon am 27. Oktober genannt...

Verfasst: 4. November 2008 20:02
von WingMan
ohhh, so meintest Du das... Das habe ich falsch verstanden. Ich dachte das bezieht sich ausschließlich auf die Möglichkeit ein QRect zu übergeben.

Jetzt wo ich Dich verstanden habe, liest sich Dein Thread für mich auch ganz anders und muss sagen, SCHEI... :evil:
Das hätte ich wohl dann schon lange abgehakt haben können, hätte ich richtig gelesen!

Werde es jetzt direkt testen!

DANKE