Проблемы разработки QFutureWatcher для улучшения времени загрузки изображений

Я пытаюсь загрузить несколько изображений, используя многопоточность через класс 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()", Спасибо за вашу помощь

1 ответ

Решение

Это потому, что функция является членом класса. Вы должны назвать это так:

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;
}
Другие вопросы по тегам