0

QtConcurrent::map を使用してこの関数を実行しようとしています

//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);
}

このコンテナー/シーケンス (mainwindow ヘッダーで宣言され、mainwindow コンストラクターで初期化される)

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

ここに私が実行しようとしているコードがあります

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

ここに私が得ているエラーがあります:

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*>*'

「imageList」内のすべての要素に対して「createQImage」関数を実行する必要があります。これは数千に達する可能性があります。map 関数の最初のパラメーターに問題があると思います。そして、私が読んだことから、互換性に関係している可能性があります。私が関連付けることができたオンラインのサンプルコードはあまりありません。私は Qt を初めて使用し、経験豊富なプログラマーではありませんが、助けとフィードバックをいただければ幸いです。

または、QtConcurrent を使用してこれを行うより良い方法はありますか?

前もって感謝します!

4

2 に答える 2

2

QtConcurrent::map最初の引数としてシーケンスが必要です。シーケンスへのポインターを渡しました。

もしあなたがそうするなら

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

それは幸せであるべきです。

コンパイラは、問題が何であるかについてかなり明確であったことに注意してください。時間をかけてエラーを注意深く読んでください。通常、エラーは最初に見えるほどわかりにくいものではありません。この場合、渡した引数がクラス型ではないことを示していました。エラーの最後にある引数の型をざっと見てみると、それがポインターであることがわかります。

于 2012-04-05T21:45:41.637 に答える
1

QListQImageQStringは Copy-On-Write 型 (その他の Qt の暗黙的に共有される型を参照) であるため、これらの型へのポインターは基本的に既にスマート ポインターであるため、使用しないでください。

また、コードからすべてのポインターを削除すると、主な問題も修正されるはずです。

于 2012-04-05T22:58:36.423 に答える