Qt 开发QFutureWatcher以提高图像加载时间的问题

Qt 开发QFutureWatcher以提高图像加载时间的问题,qt,qtconcurrent,qfuture,Qt,Qtconcurrent,Qfuture,我试图通过QFutureWatcher类使用多线程加载多个图像,但我无法正确地完成。我的代码读取图像的url并将其保存在QVector上。然后我将这些qstring传递给一个函数,该函数在QMap对象上加载、调整和保存图像。代码是: void MainWindow::loadImages(){ mImagesLoaderfutureWatcher = new QFutureWatcher<QString>() ; connect(mI

我试图通过QFutureWatcher类使用多线程加载多个图像,但我无法正确地完成。我的代码读取图像的url并将其保存在QVector上。然后我将这些qstring传递给一个函数,该函数在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();
    }
void主窗口::loadImages(){
mImagesLoaderfutureWatcher=新的QFutureWatcher();
连接(mImagesLoaderfutureWatcher,信号(finished()),此,插槽(imageLoadingfinished());
QVector imagesList=mProject->getImagesFileName();
//开始计算。
mImagesLoaderfutureWatcher->setFuture(QtConcurrent::map(imagesList,addimagesthumnailtomap));
}
void主窗口::addImageThumnailToMap(QString imageName){
QSize所需尺寸(100100);
QImage orig(mProject->getBasePath()+“/”+imageName);
QImage缩放=原始缩放(
理想尺寸,
Qt::keepassectratio,
Qt::平滑变换);
mMapImages->insert(图像名称,缩放);
}
void主窗口::imageLoadingfinished(){
QMessageBox消息;
msg.setText(“加载的图像”);
msg.show();
}
我在尝试编译时收到的错误表示,调用函数“addImageThumnailToMap”时未找到参数列表,但我认为不必在“QtConcurrent::map()”函数上指定参数。
感谢您的帮助

这是因为函数是类的成员。你应该这样称呼它:

mImagesLoaderfutureWatcher->setFuture(
   QtConcurrent::map(imagesList,&MainWindow::addImageThumnailToMap));
它还看起来像QtConcurrent::map只接受全局函数或静态函数,因为没有指向要调用的实例的指针
addImageThumnailToMap
。因此,将主窗口::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 );
}

我以前从未使用过
QtConcurrent
,但是
addImageThumnailToMap
方法可能需要(const?)按引用传递,而不是按值传递
addImageThumnailToMap
不应该是静态的吗?
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;
}