使用QtConcurrent map时序列参数出错

时间:2012-04-05 21:35:08

标签: qt concurrency qimage qtconcurrent

我正在尝试使用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做到这一点?

提前致谢!

2 个答案:

答案 0 :(得分:2)

QtConcurrent::map想要一个序列作为它的第一个参数。您将指针传递给序列。

如果你这样做

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

应该很开心。

请注意,编译器对问题的解释非常清楚。花点时间仔细阅读错误,它们通常不会像最初看起来那样神秘。在这种情况下,它告诉你你传递的参数不是类类型。快速查看错误末尾的参数类型会发现它是一个指针。

答案 1 :(得分:1)

QListQImageQString是写时复制类型(请参阅other Qt implicitly shared types),因此您不应该使用指向这些类型的指针,因为它们基本上是已经很聪明了。

如果从代码中删除所有指针,它也应该解决主要问题。