2012-04-05 5 views
0

mit Ich versuche QtConcurrent :: Karte zu verwenden, um diese FunktionFehler mit dem Argument Sequenz, wenn QtConcurrent Karte

//This function is used through QtConcurrent::map to create images from a QString path 
void MainWindow::createQImage(QString* path) { 
    //create an image from the given path 
    QImage* t = new QImage(*path); 
    imageList->append(t); 
} 

auf diesem Container/Sequenz (im Hauptfenster Konstruktor deklariert in der Hauptfenster-Header und initialisiert) zu laufen

QList<QImage *> *imageList = new QList<QImage *>; 

hier ist der Code, den ich

QFutureWatcher<void> futureWatcher; 
futureWatcher.setFuture(QtConcurrent::map(imageList, &MainWindow::createQImage)); 

laufen bin versucht, und hier sind die Fehler Ich erhalte:

request for member 'begin' in 'sequence', which is of non-class type 'QList<QImage*>*' 
request for member 'end' in 'sequence', which is of non-class type 'QList<QImage*>*' 

Ich brauche die „createQImage“ -Funktion für jedes Element ausgeführt werden soll in „Imagelist“, die in die Tausende erreichen kann. Ich glaube das Problem liegt beim ersten Parameter der Kartenfunktion. Und von dem, was ich gelesen habe, kann es mit der Kompatibilität zu tun haben. Es gibt nicht viel Beispielcode online, auf den ich mich beziehen konnte. Ich bin neu in Qt und nicht der erfahrenste Programmierer, aber ich würde etwas Hilfe und Feedback schätzen.

Oder gibt es eine bessere Möglichkeit, dies mit QtConcurrent zu tun?

Vielen Dank im Voraus!

Antwort

2

QtConcurrent::map möchte eine Sequenz als erstes Argument. Sie haben eine Zeiger an eine Sequenz übergeben.

Wenn Sie

futureWatcher.setFuture(QtConcurrent::map(*imageList, &MainWindow::createQImage)); 

tun sollte glücklich sein.

Beachten Sie, dass der Compiler ziemlich klar darüber war, was das Problem war. Nehmen Sie sich die Zeit, die Fehler sorgfältig zu lesen, sie sind normalerweise nicht so kryptisch, wie sie vielleicht auf den ersten Blick erscheinen. In diesem Fall hat es Ihnen gesagt, dass das von Ihnen übergebene Argument nicht von einer Klassenart war. Ein kurzer Blick auf den Argumenttyp am Ende des Fehlers zeigt, dass es sich um einen Zeiger handelt.

1

QList, QImage, QString sind Typen Copy-on-Write (siehe other Qt implicitly shared types), so sollten Sie keine Zeiger auf diese Art verwenden, weil sie im Grunde bereits intelligente Zeiger sind.

Und wenn Sie alle Zeiger aus Ihrem Code entfernen, sollte es auch das Hauptproblem beheben.