Ошибка с аргументом последовательности при использовании карты QtConcurrent

Я пытаюсь использовать QtConcurrent::map для запуска этой функции.

//This function is used through QtConcurrent::map to create images from a QString path
void MainWindow::createQImage(QString* path) {
    //create an image from the given path
    QImage* t = new QImage(*path);
    imageList->append(t);
}

в этом контейнере/последовательности (объявленном в заголовке основного окна и инициализированном в конструкторе основного окна)

QList<QImage *> *imageList = new QList<QImage *>;

Вот код, который я пытаюсь запустить

QFutureWatcher<void> futureWatcher;
futureWatcher.setFuture(QtConcurrent::map(imageList, &MainWindow::createQImage));

и вот какие ошибки я получаю:

request for member 'begin' in 'sequence', which is of non-class type 'QList<QImage*>*'
request for member 'end' in 'sequence', which is of non-class type 'QList<QImage*>*'

Мне нужно, чтобы функция «createQImage» запускалась для каждого элемента в «imageList», число которых может исчисляться тысячами. Я считаю, что проблема связана с первым параметром функции карты. И из того, что я читал, это может быть связано с совместимостью. В Интернете не так много примеров кода, с которыми я мог бы иметь дело. Я новичок в Qt и не самый опытный программист, но буду признателен за помощь и отзывы.

В качестве альтернативы, есть ли лучший способ сделать это с помощью QtConcurrent?

Заранее спасибо!


person jdjalm    schedule 05.04.2012    source источник
comment
Кстати, при правильной реализации (см. другие ответы) это ничего не даст. QtConcurrent::map() перебирает каждый элемент в данном списке. Поскольку вы только создаете и добавляете элементы в функцию карты, ваш imageList изначально будет пустым, и поэтому ваш createQImage() никогда не будет вызываться. Вместо этого вы можете использовать непустое, заполненное нулем QVector<QImage*> imageList(numberOfImagesYouNeed, Q_NULLPTR) и передать его в map().   -  person Martin Hennings    schedule 20.09.2018


Ответы (2)


QtConcurrent::map хочет последовательность в качестве первого аргумента. Вы передали ему указатель на последовательность.

Если вы сделаете

futureWatcher.setFuture(QtConcurrent::map(*imageList, &MainWindow::createQImage));

оно должно быть счастливым.

Обратите внимание, что компилятор достаточно ясно понял, в чем проблема. Потратьте время, чтобы внимательно прочитать ошибки, обычно они не такие загадочные, как могут показаться на первый взгляд. В этом случае он говорил вам, что аргумент, который вы передали, не относится к типу класса. Беглый взгляд на тип аргумента в конце ошибки показывает, что это указатель.

person Troubadour    schedule 05.04.2012

QList, QImage, QString — это типы копирования при записи (см. другие неявно общие типы Qt), поэтому вам не следует использовать указатели на эти типы, потому что они в основном уже являются интеллектуальными указателями.

И если вы удалите все указатели из своего кода, это также должно решить основную проблему.

person alexisdm    schedule 05.04.2012