Bilder aus QStringList laden

Alles rund um die Programmierung mit Qt
Antworten
beaf
Beiträge: 2
Registriert: 12. Dezember 2008 15:58
Kontaktdaten:

Bilder aus QStringList laden

Beitrag von beaf »

Hallo!

Im Prinzip möchte ich durch Drücken eines Buttons immer ein neues Bild auf der GUI anzeigen lassen.
Dafür habe ich die Dateinamen aus dem Bilderordner in einer QStringList eingelesen und nach Größe sortiert und kann mir die Liste auch in der Console anzeigen lassen (das funktioniert).
Hier der Code dazu:

Code: Alles auswählen

QDir d( "/home/Bilder/test/");
d.setFilter( QDir::Files | QDir::NoSymLinks );
d.setSorting( QDir::Size );

const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list );
QFileInfo *fi;

QStringList PictureList;   
//Files aus Ordner in QStringList laden
while ( (fi = it.current()) != 0 ) {
PictureList.append(fi->fileName());
++it;
}
for (QStringList::Iterator it = PictureList.begin(); it != PictureList.end(); it++)
{
cout << *it << "\n";
}
Nun möchte ich aber auf Knopfdruck immer das nächste Element der QStringList auf mein pixmapLabel mit setPixmap anzeigen lassen!

Manuell hatte ich es so implementiert:

Code: Alles auswählen

void interface2::nextPicture()
{
//neues Pixmap laden
QPixmap pic;
pic.load( "/home/Bilder/test/bild1.jpg") );
pixmapLabel->setPixmap(pic);
}
Wie bekomme ich das hin, dass meine StringList durchiteriert wird?
Vielleicht gibt es auch ne einfachere Lösung, die Bilder direkt aus dem Ordner zufällig zu laden?! Komme im Moment halt einfach nicht weiter...

Danke schonmal im Vorab.

Beaf
Waldmannsheil - ein Furz ist kein Indianerpfeil!
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Moin, du kannst auch per Index auf die Elemente einer Stringlist zugreifen. Also erzeuge eine Membervariable, in der du den aktuellen Index ablegst.

Code: Alles auswählen

void interface2::nextPicture()
{
//neues Pixmap laden
QPixmap pic;
pic.load(PictureList[m_PixIdx]); // <--- neu
pixmapLabel->setPixmap(pic);

m_PixIdx++; // <--- neu
} 
Ginsengelf
beaf
Beiträge: 2
Registriert: 12. Dezember 2008 15:58
Kontaktdaten:

Beitrag von beaf »

Danke, hat funktioniert!
Waldmannsheil - ein Furz ist kein Indianerpfeil!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Moin, du kannst auch per Index auf die Elemente einer Stringlist zugreifen.
Funktioniert aber nur unter der QT ....

Listen haben keinen Index !
Ausser bei der QT halt, da ist die Liste mehr nen Vector :-)

@beaf
Deine Frage impliziert, das du dich ned so mit standard-containern auskennst. bei QT sollt man aber scho gute c++ kentnisse haben, und die container gehoeren dazu.

Ueber listen iteriert man normalerweisse.
Also erzeuge eine Membervariable, in der du den aktuellen Index ablegst.
lege in ner membervariable nen iterator ab, und nach jedem durchlauf zaehl ihn hoch, und checke auf das ende, um ihn bei bedarf wieder auf den anfang zu setzen.

Ciao ...
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Im Prinzip hast du ja recht, aber ich finde Index irgendwie handlicher als Iteratoren, und wenn Qt die Möglichkeit schon bietet, kann man sie ja auch nutzen.

Ginsengelf
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Bei deinem beispiel mag das keine Rolle spielen ....

Aber:
Ignoranz ist einer der Ursachen allen uebels :-)
Irgendwann spielt performance mal eine rolle. und dann sich erst in die themen einlesen, wird man sicher bereuen, weil es grad dann schnell gehen muss.

Dafuer, fuer welchen zweck man welchen container nimmt, gibt es richtlinieren, anhaltspunkte. Und man sollte definitiv ein gefuehl dafuer entwickeln. Das erleichtert einem spaeter das arbeiten ungemein ....

Übrigens, genau deine Einstellung hat schon mal bissi fuer aufsehen und lacher in der Programmierer-gemeinde gesorgt.

Kann sich noch wer an den PerformanceTest in der CT zum thema programmiersprachen erinnern ???
.Net gegen java gegen c++ (MFC) gegen visual basic ....
Da wurde auch viel mit containern gearbeitet.

Fuer programmierer waer eigentlich im vorhinein klar wer gewinnt.
Aber der test brachte erstaunliche ergebnisse ^^
c++ 1.5 mal langsamer als Java ^^ Spitzenreiter: .Net
Las sich wie ne M$ Werbekampagne ....
Der quelltext war abgedruckt. Wenn man sich den angeschaut hat, dacht man bloss, naja, kein wunder :-) Damit die performance der programmiersprche und bibs ermitteln, iss wie die Hoechstgeschwindigkeit eines autos im rueckwaertsgang zu ermitteln ^^
Die einsendungen zum Thema von den programmieren warn dementsprechend. es wurde quellcode eingeliefert, der die c++ ergebnisse weit an 1. Position rueckte. (teilweise doppelt so schnell wie .net)
Kommentar des Autors dazu ... naja er hat den Code extra so geschrieben, wie ein üblicher Programmierer die bibs verwenden wuerd, und ned wie ausgebuffte Hacker. Das war dann der Lacher an der Sache.

WIe gesagt, wenn dir performance so schnuppe ist, solltest ueberlegen ob C++ die richtige Sprache fuer Dich ist. Ich wuerd dir eher ne interpretierte sprache dann empfehlen, Python mit qt z.b.
Das erspart dir teilweisse viel aerger ....
willst dir aber die Geschwindigkeitsoption offen lassen, solltest schon anfangen zu ueben in dem einige dinge performancetechnisch hinterfragst ala :
Was bietet mir der vector, welche nachteile bringt mir der, brauch ich den schnellen Index zugriff wirklich ...

Ciao ...
Antworten