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

在这个容器/序列上(在主窗口标题中声明并在主窗口构造函数中初始化)

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

QList, QImage, QString are Copy-On-Write types (see other Qt implicitly shared types), so you shouldn't use pointers to these types because they are basically already smart pointers.

And if you remove all pointers from your code, it should also fix the main problem.

于 2012-04-05T22:58:36.423 回答