term не оценивается как функция, принимающая 1 аргумент QtConcurrent

Привет, ребята, мне очень нужна ваша помощь. Все, что я хочу сделать, это масштабировать изображение и запустить его с помощью QtConcurrent. Я точно следовал документации, но все же не могу понять, где моя ошибка, вот код

void MainWindow::displayImages( QPixmap &image)
{
  image = image.scaled(100,100,Qt::KeepAspectRatio,Qt::FastTransformation); 
}
void MainWindow::showImages()
{
  QList <QPixmap> images ;
  foreach(imageName,imageList)
  {
    imageNames.push_back(imageName.toStdString());
    image.load(imageName,"4",Qt::AutoColor);
    images.push_back(image);
  }
  QtConcurrent::map(images,&MainWindow::displayImages);
}

этот код не компилируется, он продолжает выдавать мне ошибку

   1>c:\qt\4.7.1\src\corelib\concurrent\qtconcurrentmapkernel.h(73): error C2064: term does not evaluate to a function taking 1 arguments
1>          c:\qt\4.7.1\src\corelib\concurrent\qtconcurrentmapkernel.h(72) : while compiling class template member function 'bool QtConcurrent::MapKernel<Iterator,MapFunctor>::runIteration(Iterator,int,void *)'
1>          with
1>          [
1>              Iterator=QList<QPixmap>::iterator,
1>              MapFunctor=void (__thiscall MainWindow::* )(QPixmap &)
1>          ]
1>          c:\qt\4.7.1\src\corelib\concurrent\qtconcurrentmapkernel.h(201) : see reference to class template instantiation 'QtConcurrent::MapKernel<Iterator,MapFunctor>' being compiled
1>          with
1>          [
1>              Iterator=QList<QPixmap>::iterator,
1>              MapFunctor=void (__thiscall MainWindow::* )(QPixmap &)
1>          ]
1>          c:\qt\4.7.1\src\corelib\concurrent\qtconcurrentmap.h(113) : see reference to function template instantiation 'QtConcurrent::ThreadEngineStarter<void> QtConcurrent::startMap<QList<T>::iterator,MapFunctor>(Iterator,Iterator,Functor)' being compiled
1>          with
1>          [
1>              T=QPixmap,
1>              MapFunctor=void (__thiscall MainWindow::* )(QPixmap &),
1>              Iterator=QList<QPixmap>::iterator,
1>              Functor=void (__thiscall MainWindow::* )(QPixmap &)
1>          ]
1>          c:\main\work\extend3d\git\square-marker-tools\bundleadjustment\mainwindow.cpp(307) : see reference to function template instantiation 'QFuture<void> QtConcurrent::map<QList<T>,void(__thiscall MainWindow::* )(QPixmap &)>(Sequence &,MapFunctor)' being compiled
1>          with
1>          [
1>              T=QPixmap,
1>              Sequence=QList<QPixmap>,
1>              MapFunctor=void (__thiscall MainWindow::* )(QPixmap &)
1>          ]

person Poka Yoke    schedule 24.02.2012    source источник
comment
Какой номер строки и это фактический код (...)?   -  person hmjd    schedule 24.02.2012
comment
Я добавил точную ошибку, которую я получаю, пожалуйста, проверьте ее   -  person Poka Yoke    schedule 24.02.2012
comment
Теперь правки завершены, вы можете проверить это.   -  person Poka Yoke    schedule 24.02.2012


Ответы (2)


Вы не можете сделать это. Обратите внимание на документацию:

QtConcurrent::map(), QtConcurrent::mapped() и QtConcurrent::mappedReduced() принимают указатели на функции-члены. Тип класса функции-члена должен соответствовать типу, хранящемуся в последовательности

Перефразируя это, в вашем случае вы можете использовать только функции-члены класса QPixmap.

Однако вы можете добиться того, чего хотите, сделав функцию displayImage внешней:

void displayImages( QPixmap &image)
{
  image = image.scaled(100,100,Qt::KeepAspectRatio,Qt::FastTransformation); 
}
void MainWindow::showImages()
{
  QList <QPixmap> images ;
  foreach(imageName,imageList)
  {
    imageNames.push_back(imageName.toStdString());
    image.load(imageName,"4",Qt::AutoColor);
    images.push_back(image);
  }
  QtConcurrent::map(images,displayImages);
}
person pnezis    schedule 24.02.2012

Изменить на

void displayImages( QPixmap &image)
{
  image = image.scaled(100,100,Qt::KeepAspectRatio,Qt::FastTransformation); 
}

а также

QtConcurrent::map(images,displayImages);

Проблема в том, что вы передаете ссылку на функцию при вызове map, а функции-члену нужен ссылочный объект.

Редактировать Чтобы стать частью главного окна, объявите функцию статической и вызовите:

QtConcurrent::map(images,&QMainWindow::displayImages);
person UmNyobe    schedule 24.02.2012
comment
Я тоже пробовал это, но это дает мне список ошибок, сообщающих мне, что ожидаются 3 аргумента и 2 предоставлены. Чтобы решить эту проблему, я попытался передать итераторы, подобные этому QtConcurrent::map(images.begin(),images.end(),isplayImages); но я получаю сообщение об ошибке, говорящее мне противоположное 3 при условии, что ожидается 2 !!! - person Poka Yoke; 24.02.2012
comment
и первое изменение, о котором вы мне говорите, это именно то, что я делаю.. или я что-то упускаю? - person Poka Yoke; 24.02.2012
comment
Хорошо .. значит, вы имели в виду, что он не должен быть частью MainWindow, так что теперь он работает, спасибо :) - person Poka Yoke; 24.02.2012
comment
он может быть частью главного окна, но должен быть статичным. см. редактирование. - person UmNyobe; 24.02.2012