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