我正在尝试使用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做到这一点?
提前致谢!
答案 0 :(得分:2)
QtConcurrent::map
想要一个序列作为它的第一个参数。您将指针传递给序列。
如果你这样做
futureWatcher.setFuture(QtConcurrent::map(*imageList, &MainWindow::createQImage));
应该很开心。
请注意,编译器对问题的解释非常清楚。花点时间仔细阅读错误,它们通常不会像最初看起来那样神秘。在这种情况下,它告诉你你传递的参数不是类类型。快速查看错误末尾的参数类型会发现它是一个指针。
答案 1 :(得分:1)
QList
,QImage
,QString
是写时复制类型(请参阅other Qt implicitly shared types),因此您不应该使用指向这些类型的指针,因为它们基本上是已经很聪明了。
如果从代码中删除所有指针,它也应该解决主要问题。