2016-04-03 10 views
0

Was ist der beste Weg, um mehrere QFiles in einer Sammlung zu speichern? Wäre es am besten, QList, Array oder Vektoren zu verwenden?Richtiges Speichern von QFiles in einer Sammlung

Ich möchte auf das Element der Sammlung als QFile und nicht QFile * zugreifen.

Ich versuche, ein Verzeichnis in Qt zu lesen und alle Dateien in einer Sammlung zu speichern. Drucken Sie dann alle Dateinamen auf dem Bildschirm.

Wie lese ich das Verzeichnis:

QDirIterator it(p_dir, QStringList() << "*.wav", QDir::Files, QDirIterator::Subdirectories); 
while (it.hasNext()) 
{ 
    // Put file into collection 
} 

Derzeit QList Ich benutze die QFiles zu speichern:

QList<QFile*> list; 

ich gelesen, dass der beste Weg, Dateiinformationen zu erhalten ist, zu verwenden, QFileInfo-Typ Wie kann ich die QFileInfo-Datei als Element aus meiner Liste festlegen?

Ich möchte wie etwas tun:

QFileInfo info; 
QListIterator<QFile*> i(list); 
while(i.hasNext()) 
{ 
    info.setFile(i); 
} 

Aber die oben gibt mir: Fehler: keine passende Funktion für Aufruf von 'QFileInfo :: setFile (QListIterator &)' fi.setFile (i) ;

+0

Sieht aus, was Sie wollen, ist nicht QFile, sondern nur eine Reihe von Dateinamen, daher würde QStringList einfach großartig –

Antwort

1

Denken Sie daran, QFile erbt QObject, und als solche ist nicht kopierbar oder beweglich. Es ist üblich, Zeiger auf solche Objekte in Containern anstatt auf den Objekten selbst zu speichern. Wie für welchen Container zu verwenden, ist es nicht wirklich wichtig, aber QVector wird am effizientesten sein.

QListIterator ist ein Java-Iterator. Also:

QListIterator::QListIterator(const QList<T> & list)

Constructs an iterator for traversing list. The iterator is set to be at the front of the list (before the first item).

Der Iterator verweist nicht auf irgendetwas, wenn Sie das tatsächliche Objekt erhalten möchten, verwenden Sie eine i.next()QFile* zu geben, die Sie dann zu dereferenzieren haben wird, da setFile() nimmt in einem QFile &, kein QFile *.

+2

Wenn kein gleichzeitiger Zugriff erforderlich ist, ist es besser, 'QFileInfoList' zu verwenden und eine' QFile' nur zu öffnen notwendig –

1

QFile ist nicht kopierbar. In C++ 98 gibt es im Allgemeinen keine Möglichkeit, es in einem Container zu speichern, es sei denn, der Container unterstützt die direkte Konstruktion. Ich kenne keine solchen C++ 98-Container, obwohl das Schreiben gar nicht so schwer wäre.

In C++ 11 können Sie jeden Container verwenden, der keine Elemente kopieren muss und die Platzierung unterstützt, z. std::list:

// https://github.com/KubaO/stackoverflown/tree/master/questions/qfile-list-36391586 
#include <QtCore> 
#include <list> 

void populate(std::list<QFile> & files) { 
    QDir dir(QCoreApplication::applicationDirPath()); 
    for (auto fileName : dir.entryList(QDir::Files)) { 
     qDebug() << "adding file" << fileName; 
     files.emplace_back(fileName); 
    } 
} 

void iterate(std::list<QFile> & files) { 
    for (auto & file : files) 
     if (file.open(QIODevice::ReadOnly)) { 
     qDebug() << "successfully opened" << file.fileName(); 
     } 
} 

int main(int argc, char ** argv) { 
    QCoreApplication app(argc, argv); 
    std::list<QFile> files; 
    populate(files); 
    iterate(files); 
} 

Auf meinem System, wenn sie von Qt Creator laufen, der Ausgang ist:

adding file "main.o" 
adding file "Makefile" 
adding file "qfile-list-36391586" 
successfully opened "main.o" 
successfully opened "Makefile" 
successfully opened "qfile-list-36391586" 

Da QFile eine richtige Klasse ist RAII von Systemressourcen Umsetzung, erhalten die Dateien automatisch von files::~list geschlossen , bevor main zurückkehrt.

Verwandte Themen