[Qt]QImage in QGraphicsView

ActiveO2

Ensign
Registriert
Feb. 2009
Beiträge
161
[Qt]QImage in QGraphicsView [gelöst]

Hallo,

kann mir bitte jemand einen Code posten in dem ein QImage in ein QGraphicsView integriert und angezeigt wird?

Code:
ui->graphicsView->setBackgroundBrush(QPixmap("C:/img.bmp"));

tut nichts.

1. Da das Bild größer als die Form ist brauche ich eine Art QScrollArea.
Diese benutze ich aber nicht, da sich das Bild alle paar Millisekunden ändert und ich gelesen habe, dass man für sowetwas lieber ein QGraphicsView benutzen soll (Performance!) Wobei nach ersten Nachforschungen schon das .addScrollBarWidget aufgetaucht ist. Ich brauche halt diese Slider.
http://stackoverflow.com/questions/241144/how-to-set-an-initial-size-of-a-qscrollarea (Die Codeschnippsel haben mich leider nicht weiter gebracht; zumindest sehe ich kein Resultat) -
Hat GraphicsView auch Slider sowie QScrollArea?
Code:
QGraphicsScene *pic = new QGraphicsScene(ui->graphicsView);
 
QGraphicsPixmapItem *ppixItem = pic->addPixmap(QPixmap::fromImage(img));
ppixItem->setPos(0,0);

----------------------------------------------------------------------------------------------------------------
2. Nächtes Problem wäre, dass sich durch das ständige aktualisieren des Bildes, die Slider ja nicht so einfach verschieben lassen, da diese ja auch immer neu gezeichnet werden (so war es bisher mit der QScrollArea - es wurde die ganze Form geupdatet).

----------------------------------------------------------------------------------------------------------------
3. Später möchte ich noch in den Bereich, in dem das Bild ist, eine Feste Linie mit QPainter::drawLine integrieren. Diese bleibt konstant auf der Position, soll an und ausgeschalten werden. Sprich: es ist Möglich die Slider so zu verstellen, dass man die Linie nicht mehr sieht.


Ziemlich viel, aber ich bin mir sicher, dass mir jemand weiterhelfen kann ;)

Auch wenn ihr (erstmal) nur zu der ersten Frage eine Antwort habt, würdet ihr mir schon sehr weiterhelfen.


Quellen bisher:
Qt Examples and Demos: Colliding Mice
http://stackoverflow.com/questions/241144/how-to-set-an-initial-size-of-a-qscrollarea
http://doc.trolltech.com/4.5/qgraphicsview.html
http://www.qtforum.de/forum/viewtopic.php?t=9690&view=next&sid=0af6fba7ec97046720823cb48eb34e8a

vielleicht hat jemand das Buch C++ GUI - Proggramieren mit Qt4 und kann mir da entscheidente Zeilen verraten (S. 257 ff ich hab nichts brauchbares gefunden :/ )

PS: mich irritiert, dass ich nichtmal ganz normal ein Bild anzeigen kann. :freak:
 
Zuletzt bearbeitet: (Das Komma (Pl.: Kommas, Kommata; auch: der Beistrich) ist ein Satzzeichen und mathematisches Symbol. ("Wiki"))
So sieht die Signatur aus:
void setBackgroundBrush ( const QBrush & brush )

Das heißt, dass du schon mal kein QPixmap übergeben kannst. Meckert da nicht der Compiler?
Du kannst aber ein QBrush erstellen und dem Konstruktor ein QPixmap geben:
ui->graphicsView->setBackgroundBrush( QBrush(QPixmap("C:/img.bmp")) );

Oder du ersetzt QPixmap durch QImage. Keine Ahnung wo da der relevante Unterschied ist. Ich habe mich bei Qt noch nie mit Bilder auseinandergesetzt.

1. QGraphicsView ist von QAbstractScrollArea abgeleitet. Sobald der Inhalt des QGraphicsView großer als der View selbst wird, werden die Scrollleisten angezeigt. Automatisch!

2. Vielleicht hilft da eine der drei QGraphicsView::centerOn(...) Methoden.

3. Ich lese da keine Frage aus dem Absatz!
 
Danke für die Antworten!
Der Compiler meckert nicht.

Code:
ui->graphicsView->setBackgroundBrush(QBrush(QPixmap("C:/img.bmp")));
und
Code:
QImage img("C:/img.bmp");
ui->graphicsView->setBackgroundBrush(QBrush(img));
funktionieren leider beide nicht.

1. War wichtig, danke.

2. Versuch ich sobald ich mal das Bild angezeigt bekomme. :P

3. sollte eine weitere Aufgabe schildern, um mir vielleicht weiter Denkanstöße zu verpassen wie drittens den zu realisieren wäre.


PS: gerade beim ausprobieren des graphicsView->setBackgroundBrush(~~) hat sich der "error: collect2: ld returned 1 exit status" immer wieder gemeldet.
Gibt es etwas allgemeines zu beachten, wenn man Code öftern kommentiert, auskommentiert, neuen hinzufügt,...

es werden alle Daten gefunden, allerdings muss ich jedesmal(, wenn der Fehler kommt) erst noch das "Makefile" löschen damit es neu erstellt wird (*nerv*).
 
Zuletzt bearbeitet: (Der Begriff Unterstrich bezeichnet das im ASCII-Zeichensatz auf der Position 95 (dezimal) bzw. 0x5F (hexadezimal) dargestellt)
error: collect2: ld returned 1 exit status
Das ist ein Linker-Error, der viele Quellen haben kann, z. B. wenn eine Bibliothek fehlt oder eine Funktion nicht deklariert wurde.
Wenn du den QtCreator nutzt, versuch mal alles neu zu erstellen.

Wie sieht es aus mit:

ui->graphicsView->setScene(pic);


Aber auch ich habe in Qt noch nie was mit Bildern gemacht...

Gruß,

badday
 
Das ist ein Linker-Error, der viele Quellen haben kann, z. B. wenn eine Bibliothek fehlt oder eine Funktion nicht deklariert wurde.
Wenn du den QtCreator nutzt, versuch mal alles neu zu erstellen.
Ja soweit bin ich schon^^, deshalb hab ich noch gemeint dass alle Daten gefunden werden ;)
und ich jedes mal die "Makefile"-Datei im Projektordner löschen muss, damit ich wieder erfolgreich kompilieren kann.
Zugegeben, ich habe mich ungenau ausgedrückt.
Trotzdem danke für den Beitrag.
Ob durch das Kommentieren in einer Datei, Daten (nicht verändert oder) verändert werden die zu dem Fehler führen, wäre möglich?

Code:
QGraphicsScene *sc = new QGraphicsScene();
sc->setBackgroundBrush(QBrush(img));
ui->graphicsView->setScene(sc);
...funktioniert soweit.
Also so habe ich zumindest mal mein Bild drin *juhu* ;)
Aber bisher ist es noch gevierteilt^^
Wie das aussieht?!

Um es mal "graphisch" darzustellen:

[1][2][3]
[4][5][6]
[7][8][9] //eigentliches Bild in Felder unterteilt

[9][7]
[3][1] // so wird es bisher in meinem QGraphicsView angezeigt.
 
Zuletzt bearbeitet:
Naja zumindest hast du nun dein Bild^^.

Ob durch das Kommentieren in einer Datei, Daten (nicht verändert oder) verändert werden die zu dem Fehler führen, wäre möglich?
Wenn du da nichts auskommentiert hast, was wichtig wäre: nein.

Was ist denn wenn du alles neu erstellst? Das sollte gehen, da da der Makefile (soweit ich weiß) nicht angeschaut wird. Wäre zumindest als Übergangslösung bequemer.

Was ist, wenn du eine Scrollbar hinzufügst?
Oder irgendwas in Richtung void QGraphicsView::ensureVisible ?

Sorry, aber das ist nicht mein "Fachgebiet" bei Qt.

Gruß,

badday
 
Sorry, aber das ist nicht mein "Fachgebiet" bei Qt.
Macht nichts, ich bin für jede Hilfe dankbar. :D
QGraphicsView ist mir auch ziemlich neu.

Ob das Mit der ScrollBar die Aufteilung des GraphicsView ändert ändert würde mich wundern^^
void QGraphicsView::ensureVisible
guck ich mir gleich mal an.

vielleicht meldet sich ja Baron nocheinmal *Achtung Zaunpfahl*
1. QGraphicsView ist von QAbstractScrollArea abgeleitet. Sobald der Inhalt des QGraphicsView großer als der View selbst wird, werden die Scrollleisten angezeigt. Automatisch!
 
Zuletzt bearbeitet:
Nein, das Resultat verunsichert mich.
Ich übergebe mit
Code:
QGraphicsScene *sc = new QGraphicsScene();
sc->setBackgroundBrush(QBrush(img));  // QImage img("C:/img.bmp"); 
ui->graphicsView->setScene(sc);
das Bild. Es müsste also eigentlich komplett drin sein, oder sehe ich das falsch?
 
Zuletzt bearbeitet: (BBCode (von engl. Bulletin Board Code) ist eine sehr eng an HTML angelehnte, jedoch vereinfachte Auszeichnungssprache.)
Ja davon gehe ich aus.
Es müsste zumindest in sc drinnen sein.
Die Frage, die ich mir stelle: Was ist, wenn graphicsView zu "klein" ist, sc aufzunehmen?
Also was passiert, wenn du graphicsView größer machst?

Gruß,

badday
 
Code:
ui->graphicsView->setFixedHeight(img.size().height()+1);  //+1 damit das das [I]GV[/I] wirklich nicht zu klein ist
ui->graphicsView->setFixedWidth(img.size().width()+1);

Das Bild wird [mit setBackgroundBrush] immernoch viergeteilt angezeigt (gleiche Formation). Allerdings sind die Felder nun größer (nicht gestreckt).



Edit:

Es lag an
QGraphicsScene::setBackgroundBrush!

Mit:
QGraphicsScene::addPixmap

wird das Bild richtig angezeigt! Scrollleisten wurden ebenfalls automatisch hinzugefügt.



Danke für die große Unterstützung.

Ein letzter ...
 
Zuletzt bearbeitet:
Zurück
Oben