Archiv verlassen und diese Seite im Standarddesign anzeigen : Bilder mit Qt laden???
Wie kann ich Bilder in mein Qt-Programm laden?
Also zum Beispiel eine bmp-, jpg- oder sonst eine andere Datei.
Geht das mit einer bereits vorgefertigten Funktion, oder muss ich die Dateien dann selbstständig auslesen?
Gruß,
Miles
tuxipuxi
27-05-2003, 15:51
hi,
bitte stell deine frage etwas genauer. was hast du mit dem bild vor?
gruss,
tuxipuxi.
Ich habe vor ein Bild aus einer externen Datei (*.bmp, *.jpg,...) zu laden und dann eben in einem Widget auszugeben (auf einem Label oder etwas anderem).
Nur weiß ich keine Funktion dafür. Ich weiß nicht ob ich das mit QImage, QPixmap oder sonst wie machen muss. Oder ob ich eben alles mit einer eigenen Funktion selbst auslesen muss.
anda_skoa
27-05-2003, 18:00
Wenn du es nur darstellen willst, kannst du es gleich in ein QPixmap laden.
Wenn du es bearneiten willst, zuerst in ein QImage.
Ciao,
_
Und wie lade ich eine Bild-Datei in ein QPixmap? Ich hab schon versucht es im Konstruktor als String anzugeben (so wie es in der Doku steht), aber es will nicht klappen. Muss ich da irgendetwas beachten? Die Bitmapgröße (256 mal 256 Pixel) passt so.
Könnte es daran liegen, wie ich den String angebe, der sagt welche Datei geladen werden soll? Ich bin mir da nicht sicher unter Linux.
tuxipuxi
27-05-2003, 18:49
hi,
da musst du eigentlich nichts beachten, ausser das es ein absoluter pfad ist( sonst wuerde er nur im workdir gucken).
edit:
und der richtige datentyp, ich glaube es werden viele formate nicht unterstuetzt. (nicht sicher)
Ok. Soweit klappt das jetzt schon. Nur ein Problem gibt es noch:
Wenn ich den Pfad ganz angebe (also mit dem Root-Directory etc.), dann passt alles. Aber wenn ich das Directory nur von der lokalen Position (also mit ./) angebe passiert immer irgend ein Blödsinn. Woran liegt das? Und wie kann ich es verhindern, dass mein Programm immer in einem festen Pfad sein muss, damit es funktioniert?
tuxipuxi
27-05-2003, 19:28
ich verstehe dein problem nicht ganz. warum kannst du nicht den kompletten pfad angeben?
du koenntest mal versuchen den dateinamen im aktuellen verzeichnis mit z.b. ("datei.jpg") anzugeben.
anda_skoa
27-05-2003, 19:39
Im aktuellen Verzeichnis tut der Dateiname, ohne ./
Du bist wahrscheinlich in die Typfalle gelaufen :)
Ein char* wird als xpm data array interpretiert, wenn du explizit einen QString angibst, interpretiert er es als Filename.
Im Zweifelsfalle die Methode load benutzen.
Ciao,
_
Nein, nein. Es liegt nicht daran. Ich hab es jetzt nochmal expliziet mit QString probiert. Es macht keinen Unterschied:
Wenn ich bei load() bzw. dem Konstruktor das gesamte Verzeichnis angebe klappt alles wunderbar. Auch mit mehreren Instanzen des Programms. Aber wenn ich nur ein lokales Direktory angebe macht es Probleme. Als ob ich immer die gleiche Zwischenspeicher-Datei laden würde. Es wird nämlich dann immer mit der veränderten, alten Datei weitergearbeitet, anstatt dass sie neu geladen wird. - HE? ^^
anda_skoa
27-05-2003, 20:10
Ich kann dir nicht ganz folgen.
Vielleicht kannst du ein kleines Beispiel posten.
Wenn nötig als tgz oder so
Ciao,
_
Ich packs echt nicht. Es FUNKTIONERT EINFACH nicht. Und ich weiß nicht wieso. Ich will einfach ein Bild laden. Es ist im gleichen Directory wie die Anwendung. Dann müsste ich doch
if(!pPixmap->load("test.jpg"))
...
schreiben können. Kann ich aber nicht. Es funktioniert einfach nicht. Es gibt immer den Wert 'false' zurück.
Aber wenn ich
if(!pPixmap->load("/my_data/programming/test3/test.jpg"))
...
angebe (also das absolute Directory), dann funktioniert es anstandslos. Wieso???
Ich hab auch schon ewig lange mit QDir herumprobiert. Aber mit dem funktioniert auch nichts.
Wie kann ich einfach ein Bild aus meinem aktuellen Directory laden? Auch mit "./" klappt es nicht.
tuxipuxi
28-05-2003, 16:44
Hi,
ich glaube du taeuschst dich einfach in deinem vermeintlichen workdir. liegt das bild im gleichen ordner wie die ausgefuehrte executable?
und nochmal die frage, das stoert dich an abs. path.
gruss,
tuxipuxi.
Achso. Jetzt versteh ichs. Wenn ich nur die Datei angebe sucht er bei mir nicht im gleichen Verzeichnis wie die exe. Aber wieso? Er geht dann immer nach "/root/". Ins "aktuelle" Verzeichnis. :rolleyes:
Aber was muss ich machen, wenn ich direkt in dem Direktory, in dem Die exe ist, die Datei laden will? Geht das?
Ich hab z.B. die exec test im Directory "/my_data/programming/test3".
Wie mache ich das? (ohne das Directory genau zu wissen, sodass das Programm von allen Directories aus funktioniert, vorausgesetzt die Dateien sind alle dabei)
tuxipuxi
28-05-2003, 17:24
es tut mir leid, aber ich habe wirklich keinen schimmer was du mir sagen moechtest. ich kann nur etwas in der art rausfinden, dass du als root arbeitest, das solltest du dringlichst unterlassen.
Oh man. :rolleyes: :o
Ok. :D Ich versuche es so gut zu erklären, wie es mir möglich ist. Also. Nehmen wir an, ich schreibe ein Programm. Wenn es dann fertig ist will ich, dass auch andere Leute mein Programm benutzen können. Dazu stelle ich es auf irgendeiner Seite zum Download bereit.
Jetzt stellen wir uns weiter vor, WIR sind so ein Benutzer, der unbedingt mein Programm testen will. Wir laden und das Programm herunter und packen das ganze Programm in irgendein Directory, welches wir uns SELBST aussuchen wollen. Wir laden also die Executable in IRGENDEIN Directory. Jetzt ist bei dem Programm aber noch eine JPG-DATEI. Wie sollte aber das Programm wissen, wo die JPG-Datei ist? Wenn ich im Programm den GANZEN PFAD angegeben hab, dann muss das doch spätestens jetzt wo es ein anderer benutzt, nicht mehr das gleiche Directory sein, oder? (Ich hoffe, es war bis jetzt verständlich.)
Mein Programm (die Executable) muss also wissen, wo die JPG-Datei ist. Also wäre es doch am praktischsten, wenn das Programm wüsste, wo SEINE EIGENE EXECUTABLE ist, also in welchem DIRECTORY sie gestartet wurde. Dann müsste ich einfach dieses Directory + Name der JPG-Datei angeben. Und alle wären glücklich. :D
Biiiitte, war das verständlich, was ich brauche? ^__^"""""" Damit ist gewährleistet, dass MEIN PROGRAMM in JEDEM BELIEBIGEN DIRECTORY ausführbar ist (vorausgestetzt die JPGs sind dabei).
tuxipuxi
28-05-2003, 18:56
hoi,
ich wuerde es ja immer noch mit load( "name.jpg" ) machen, aber das geht ja wohl net.
gibt eine andere einfache loesung: getenv(). damit kannst du dir umgebungsvariablen holen.
dein beispiel:
QString workDir = getenv( "PWD" );
dann halt load( workDir+"name.jpg" ).
gruss,
tuxipuxi.
anda_skoa
28-05-2003, 21:12
Ich hab schon ziemlichweit vorne geschrieben, dass für Dateien im aktuellen Pfad der Dateiname reicht.
Das ist schliesslich der Referenzpunkt für das Programm.
Ist so auf allen Betriebsystem die ich kenne.
Wenn deine Bilder zB Icons sind und damit kleine statische Daten, kannst du sie als xpm direkt ins Programm kompilieren.
In einer KDE Anwendung wäre dir der Ort der Datei völlig egal, da du sie ohnehin immer über KStandardDirs bzw. der Funktion locate findest.
Einer der Vorteile, wenn man für eine Plattform programmiert :)
Ciao,
_
anda_skoa
28-05-2003, 21:14
Original geschrieben von tuxipuxi
QString workDir = getenv( "PWD" );
QDir::current?
QDir::currentDirPath?
Ciao,
_
celindir
24-06-2003, 19:46
Original geschrieben von anda_skoa
Wenn deine Bilder zB Icons sind und damit kleine statische Daten, kannst du sie als xpm direkt ins Programm kompilieren.
_
Hallo Anda_Soka
genau das würde ich auch gerne machen, hast Du einen Tipp für mich wie?
im moment sieht es so aus
in der headerdatei:
//image includes
#include "auto_icon.xpm"
#include "chapter.xpm"
#include "movie.xpm"
#include "select.xpm"
#include "still.xpm"
und in der cpp Datei
//load the icons
QPixmap * still_icon = new QPixmap( *still_xpm );
QPixmap * movie_icon = new QPixmap( *movie_xpm );
QPixmap * chapter_icon = new QPixmap( *chapter_xpm );
QPixmap * select_icon = new QPixmap( *chapter_xpm );
wenn ich das Icon aber dann in eine Combobox einfügen will
cbb_timeout->insertItem( select_icon, myChild->text(0) , -1 );
bekomme ich folgende Fehlermeldung
vcdkompanion.cpp:218: error: no matching function for call to `QComboBox::
insertItem(QPixmap*&, QString, int)'
/usr/lib/qt3/include/qcombobox.h:83: error: candidates are: void
QComboBox::insertItem(const QString&, int = -1)
/usr/lib/qt3/include/qcombobox.h:84: error: void
QComboBox::insertItem(const QPixmap&, int = -1)
/usr/lib/qt3/include/qcombobox.h:85: error: void
QComboBox::insertItem(const QPixmap&, const QString&, int = -1)
Was muss ich anders machen?
Vielen Dank
celindir
25-06-2003, 13:20
Hallo zusammen,
ich hab inzwischen eine andere Lösung gefunden.
ich habe ein Icon als png vorliegen.
Das konvertiere ich nun mit
convert icon.png icon.xpm
in ein xpm. Das öffne ich mit einem Editor und kopiere den Quelltext in mein Programm und füge bei static char *icon[] noch ein const ein
static const char *icon[] = {
/* columns rows colors chars-per-pixel */
"14 14 3 1",
" c black",
". c red",
"X c gray100",
/* pixels */
" ",
" XX XXXXXX XX ",
" XXXXXX ",
" .....X ",
" XX .....X XX ",
" XX ..XXXX XX ",
" ..XXXX ",
" ..XXXX ",
" XX ..XXXX XX ",
" XX ..XXXX XX ",
" .....X ",
" .....X ",
" XX XXXXXX XX ",
" "
};
nun kann ich das Icon mit
QPixmap chapter_icon(icon);
in meinem Programm verwenden und brauche das Original als Datei gar nicht mehr.
Klappt bei mir prima und ich muss mir keine Gedanken mehr machen, wo ich die Icons hinspeichern/installieren soll:)
anda_skoa
25-06-2003, 15:06
genau das selbe geht mit include auch.
Dein Compilerfehler war eine Typunstimmitgkeit, weil du einen QPixmap Poinetr übergeben hast.
Das #include macht ja nix anderes, als die angegeben Datei dort einzufügen.
Der Rest des Codes muss so sein, wie du ihn jetzt hast.
Ciao,
_
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.