我试图通过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()”函数上没有指定参数列表。谢谢你的帮忙
发布于 2015-06-19 12:40:23
因为函数是类的成员。你应该这样称呼它:
mImagesLoaderfutureWatcher->setFuture(
QtConcurrent::map(imagesList,&MainWindow::addImageThumnailToMap));它还类似于QtConcurrent::map只接受全局函数或静态函数,因为没有指向调用addImageThumnailToMap的实例的指针。所以去核的MainWindow::addImageThumnailToMap是静态的。
我个人更喜欢使用QtConcurrent::run,它可以处理类成员函数。例如:
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;
}https://stackoverflow.com/questions/30937566
复制相似问题