我正在尝试通过QFutureWatcher类使用多线程加载多个图像,但我无法正确执行。我的代码读取了图像的URL并将它们保存在QVector上。然后我将这些QStrings传递给一个函数,该函数在QMap对象上加载,调整大小并保存图像。代码是:
void MainWindow::loadImages(){
mImagesLoaderfutureWatcher = new QFutureWatcher<QString>() ;
connect(mImagesLoaderfutureWatcher, SIGNAL(finished()),this, SLOT(imageLoadingfinished()));
QVector<QString> imagesList = mProject->getImagesFileName();
// Start the computation.
mImagesLoaderfutureWatcher->setFuture(QtConcurrent::map(imagesList,addImageThumnailToMap));
}
void MainWindow::addImageThumnailToMap(QString imageName){
QSize desiredSize(100,100);
QImage orig(mProject->getBasePath()+"/"+imageName);
QImage scaled = orig.scaled(
desiredSize,
Qt::KeepAspectRatio,
Qt::SmoothTransformation);
mMapImages->insert(imageName,scaled);
}
void MainWindow::imageLoadingfinished(){
QMessageBox msg;
msg.setText("Images loaded");
msg.show();
}
我在尝试编译时收到的错误表示调用函数“addImageThumnailToMap”中的参数列表未找到,但我认为它不是必需在“QtConcurrent :: map”上指定的( )“功能。 谢谢你的帮助
答案 0 :(得分:1)
这是因为该函数是类的成员。你应该这样称呼它:
mImagesLoaderfutureWatcher->setFuture(
QtConcurrent::map(imagesList,&MainWindow::addImageThumnailToMap));
看起来QtConcurrent :: map只接受全局函数或静态函数,因为没有指向实例的指针来调用addImageThumnailToMap
。因此将MainWindow::addImageThumnailToMap
视为静态。
我个人更喜欢使用QtConcurrent::run
,它可以处理类成员函数。 E.g:
void ImageGroupView::setImages( QStringList il )
{
//QFuture<int> _imageLoader;
//QFutureWatcher<int> _watcher;
_imageLoader = QtConcurrent::run(this, &ImageGroupView::loadImages, il );
connect(&_watcher, SIGNAL(finished()), this, SLOT(processImagesReady()));
_watcher.setFuture( _imageLoader );
}
模板参数恰好是int,因为函数loadImages返回实际加载的图像的数量。
int ImageGroupView::loadImages( QStringList il )
{
int numLoaded=0;
_images.clear();
foreach ( QString img, il )
{
if( QFileInfo( img ).exists() )
{
_imageList.append( QImage( img ).scaled(640,480) );
numLoaded++;
}
}
return numLoaded;
}