首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开发QFutureWatcher提高图像加载时间的几个问题

开发QFutureWatcher提高图像加载时间的几个问题
EN

Stack Overflow用户
提问于 2015-06-19 11:56:13
回答 1查看 330关注 0票数 1

我试图通过QFutureWatcher类使用多线程加载多个映像,但我无法正确地完成它。我的代码读取图像的url并将它们保存在QVector上。然后,我将这些QStrings传递给一个函数,该函数可以加载、调整大小和保存QMap对象上的图像。守则是:

代码语言:javascript
复制
    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()”函数上没有指定参数列表。谢谢你的帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-19 12:40:23

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

代码语言:javascript
复制
mImagesLoaderfutureWatcher->setFuture(
   QtConcurrent::map(imagesList,&MainWindow::addImageThumnailToMap));

它还类似于QtConcurrent::map只接受全局函数或静态函数,因为没有指向调用addImageThumnailToMap的实例的指针。所以去核的MainWindow::addImageThumnailToMap是静态的。

我个人更喜欢使用QtConcurrent::run,它可以处理类成员函数。例如:

代码语言:javascript
复制
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返回实际加载的映像数。

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30937566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档