QtConcurrent 给出错误
Posted
技术标签:
【中文标题】QtConcurrent 给出错误【英文标题】:QtConcurrent gives errors 【发布时间】:2016-04-21 15:27:33 【问题描述】:鉴于下面的代码,我得到以下错误:
fileio.cpp:47: 错误: C3867: 'FileIO::read': 非标准语法;采用 '&' 创建一个指向成员的指针
fileio.cpp:47: 错误: C2780: 'QFuture QtConcurrent::map(Iterator,Iterator,MapFunctor)':需要 3 个参数 - 提供 2 个
为什么会这样?
fileio.h
#ifndef FILEIO_H
#define FILEIO_H
#include <QtCore>
class FileIO : public QObject
Q_OBJECT
Q_DISABLE_COPY(FileIO)
signals:
void finished();
public slots:
Q_INVOKABLE void cancel();
private:
void read(QString &fileURL);
public:
FileIO(QObject *parent = 0);
~FileIO();
Q_INVOKABLE void read_b64(const QString &fileURL);
;
#endif // FILEIO_H
fileio.cpp
#include "fileio.h"
#include <QFile>
#include <QDebug>
#include <QUrl>
#include <QThread>
#include <QtConcurrent>
FileIO::FileIO(QObject *parent)
: QObject(parent)
FileIO::~FileIO()
void FileIO::read(QString &filePath)
QByteArray finalBytes = QByteArray();
filePath = QUrl(filePath).toLocalFile();
QFile file(filePath);
qDebug() << "file size: " << file.size();
if (file.open(QIODevice::ReadOnly))
finalBytes = file.readAll();
qDebug() << "byte size: " << finalBytes.length();
//bytes.toBase64();
void FileIO::read_b64(const QString &filePath)
QFutureWatcher<void> futureWatcher;
QObject::connect(this, &FileIO::cancel, &futureWatcher, &QFutureWatcher<void>::cancel, Qt::UniqueConnection);
QObject::connect(&futureWatcher, &QFutureWatcher<void>::finished, this, &FileIO::finished);
QStringList filePaths;
filePaths << filePath;
QFuture<void> future = QtConcurrent::map(filePaths, this->read);
futureWatcher.setFuture(future);
【问题讨论】:
【参考方案1】:this->read
无效。您想使用std::bind
将非静态成员函数与实例绑定,创建一个可调用对象,然后调用QtConcurrent::map
的第一个重载,采用两个参数:
QFuture<void> future =
QtConcurrent::map(filePaths, std::bind(&FileIO::read, this));
【讨论】:
好吧,简单地声明 read 没有类命名空间(不确定正确的词)是有效的。即 void read 不是 void FileIO::read @davidkomer 哎呀,我错过了一些东西。现在它应该与read
作为非静态成员函数一起使用。或者也许你应该考虑制作read
static
成员函数。以上是关于QtConcurrent 给出错误的主要内容,如果未能解决你的问题,请参考以下文章